如何给线程传递参数 全局变量什么的自不必说,我想问的是需要临时构造的那种小结构体参数。我以前是在调用前new,然后在线程中复制参数,然后delete。但这样做好像不太好吧,比如正复制着呢,线程被终止了啥的。应该怎么做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 原则上来说是谁申请谁释放的,不过一般情况下就用你原来的方法挺好,否则还需要管理线程状态,有点得不偿失。出现线程被终止这种情况本来就属于非正常状态了,内存泄露就泄露了吧,管它……就算你在其它线程管理内存,那是不是要考虑管理线程被终止的状态……如果你要考虑到将线程单独做到DLL里面,另当别论,肯定谁申请谁释放比较合适。 楼主如果想要在执行过程中允许被打断,建议使用共享标志变量的做法,即线程在运行过程中轮循标志位来获取退出信号,在需要退出的时候自行return,而不是由别的线程来Terminate。如果你的线程只能用Terminate来退出才能获得较高的效率或其它想得到的特性,那可以考虑将内存分配、内存释放的操作通通放到由互斥量管理的共享区,由主线程在创建子线程前主动调用内存分配,然后创建线程,在Terminate之后主动释放内存。 个人觉得结构体参数的指针声明为全局的或者类的成员变量,调用前new,然后在线程中不必复制参数,只需读取,线程退出后delete。这样很好,不可能存在线程终止造成内在泄漏的情况,因为线程的终止是在掌控之中的,不是吗? 互斥区是你创建的一个内存区域,可以创建几个管理内存的函数来对子线程所需的内存对象进行申请与管理。这几个函数应该至少提供ReleaseAll()和PreAlloc()函数(函数名字只是举例)来对子线程需要的变量做分配和释放。而这几个函数应该和子线程函数处在同一个DLL文件或EXE中,以免造成内存使用问题。创建线程时,主线程应该使用类似以下的结构HANDLE hMem = PreAlloc(); // HANDLE是自定义的一个数据类型,最好是指针或数字,这样才能传给子线程。_beginThread(..., hMem...);而在子线程中,应该使用新的函数来对内存对象进行访问例如 My_Alloc()之类,如果是新建对象,更为复杂一点……在重启线程或线程被强制结束后,应使用ReleaseAll(hMem)来对内存进行释放。当然,在释放之前,别忘了使用WaitForSingleObject来对线程状态进行检测。在分配与释放函数中,为了多线程安全,可以将函数内部加上互斥锁。以上的方法仅限于你只能用Terminate来结束线程,而线程内部又有额外的内存开销需要释放的这种特殊情况下才能够用。而这个过程其实将线程的管理复杂化了,对于一般的线程来说,均是不需要这样复杂的管理机制的。这里只是针对你可能需要的特殊情况而进行探讨。事实上,貌似和你现在遇到的问题离得有点远了,呵呵…… 定义一个结构体struct YourData{ int a; int b;};YourData* nData;赋值nData->a = 1;nData->b = 2;//创建线程.第二个就是传地址。CWinThread* pThread = AfxBeginThread(NewThread,nData,THREAD_PRIORITY_NORMAL);如果是一个参数的话。比如int a = 10;AfxBeginThread(NewThread,&a,THREAD_PRIORITY_NORMAL); 就可以了。UINT NewThread(LPVOID lpParam){YourData* nData=(YourData*)lpParam;//如果是第二个情况的话。//int* a = (int*)lpParam;//printf("%d", *a);printf("%d %d", nData->a, nData->b);retrun 0;} 如果不是全局变量,最好用new新开辟一块内存来存数据。 如何让子对话框部分显示 串口发送数据 (SDK)改变菜单形状的问题 多线程加CInternetSession类问题.... 我用adoo为什么不能movelast(), BoundChecker & 内存泄露问题 控制台的问题,应该是很简单的一个问题,可是好久没解决 关于波形文件的调整问题(高手求救) ACTIVEX和COM之间有什么区别吗? 显式链接DLL时如何使用其中的输出类和变量? VC创建Excel表单问题 CListCtrl控件当选中一项时候如何能知道
就算你在其它线程管理内存,那是不是要考虑管理线程被终止的状态……如果你要考虑到将线程单独做到DLL里面,另当别论,肯定谁申请谁释放比较合适。
HANDLE hMem = PreAlloc(); // HANDLE是自定义的一个数据类型,最好是指针或数字,这样才能传给子线程。
_beginThread(..., hMem...);而在子线程中,应该使用新的函数来对内存对象进行访问
例如 My_Alloc()之类,如果是新建对象,更为复杂一点……在重启线程或线程被强制结束后,应使用
ReleaseAll(hMem)来对内存进行释放。当然,在释放之前,别忘了使用WaitForSingleObject来对线程状态进行检测。在分配与释放函数中,为了多线程安全,可以将函数内部加上互斥锁。以上的方法仅限于你只能用Terminate来结束线程,而线程内部又有额外的内存开销需要释放的这种特殊情况下才能够用。而这个过程其实将线程的管理复杂化了,对于一般的线程来说,均是不需要这样复杂的管理机制的。这里只是针对你可能需要的特殊情况而进行探讨。事实上,貌似和你现在遇到的问题离得有点远了,呵呵……
struct YourData
{
int a;
int b;
};YourData* nData;
赋值
nData->a = 1;
nData->b = 2;
//创建线程.第二个就是传地址。
CWinThread* pThread = AfxBeginThread(NewThread,nData,THREAD_PRIORITY_NORMAL);如果是一个参数的话。
比如
int a = 10;
AfxBeginThread(NewThread,&a,THREAD_PRIORITY_NORMAL); 就可以了。
UINT NewThread(LPVOID lpParam)
{
YourData* nData=(YourData*)lpParam;
//如果是第二个情况的话。
//int* a = (int*)lpParam;
//printf("%d", *a);printf("%d %d", nData->a, nData->b);
retrun 0;
}
最好用new新开辟一块内存来存数据。