怎样正确调用CreateThread

qin_wei 2001-12-05 04:37:16
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);

lpParameter是传递给线程主函数的参数,在使用时出现如下问题:
定义一个局部变量char a[255];并把a传递过去,线程主函数使用强制转换没有问题。
但定义一个局部结构如POINT P;把&P传过去时,线程主函数使用强制转换就出错,程序非法操作退出
请问这是什么原因?
...全文
194 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowCan 2001-12-06
  • 打赏
  • 举报
回复
那就加个static
qin_wei 2001-12-06
  • 打赏
  • 举报
回复

ShowMessage(a->x); 没有错,否则编译都通不过。它在bcb中自动转换为String类型
xiterator(xi)和darkay(火凤凰) 应该有道理。
darkay 2001-12-05
  • 打赏
  • 举报
回复
你的a是个局部变量,在调用完CreateThread之后这个变量已经消失啦,再调用ShowMessage的话,就相当于操作一个不属于你的内存,不出现问题才是你最痛苦的啦。还好你现在已经知道,你要么使用全局变量,要么动态分配一块内存,然后在你的线程中使用完毕后删除这块内存。
NowCan 2001-12-05
  • 打赏
  • 举报
回复
ShowMessage(IntToStr(a->x));
jellimy 2001-12-05
  • 打赏
  • 举报
回复

#include <stdlib.h>
jellimy 2001-12-05
  • 打赏
  • 举报
回复
例2中,CreateThread的使用是没有问题的,问题在ShowMessage函数的使用。
试试
char buffer[20];
_itoa( a->x , buffer, 10 );
ShowMessage(buffer);
xiterator 2001-12-05
  • 打赏
  • 举报
回复
最好不要将一个线程A的stack中的变量通过lpParam传入另一个线程B中,否则有可能在B运行后A的stack变量已被pop了导致悬挂指针。可以在heap中创建变量再通过lpParam传入。
qin_wei 2001-12-05
  • 打赏
  • 举报
回复
例1:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char a[255];
strcpy(a,"qinwei");
DWORD dwThreadId;
CreateThread(NULL,0,ClientThread,(LPVOID)a,0,&dwThreadId);
}
DWORD WINAPI ClientThread(LPVOID lpParam)
{
char* a = (char* )lpParam;
ShowMessage(a);// <------------通过
return 0;
}

例2:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
POINT a;
DWORD dwThreadId;
a.x=7;
CreateThread(NULL,0,ClientThread,(LPVOID)&a,0,&dwThreadId);
}
DWORD WINAPI ClientThread(LPVOID lpParam)
{
POINT* a = (POINT* )lpParam;
ShowMessage(a->x);// <------------出错
return 0;
}
jellimy 2001-12-05
  • 打赏
  • 举报
回复
把你的代码贴上来吧,这样描述不是很清楚。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧