永发信息网

如何在子线程中访问父线程的空间

答案:2  悬赏:30  手机版
解决时间 2021-05-15 04:11
  • 提问者网友:沉默的哀伤
  • 2021-05-14 11:19

在窗体上创建的空间Label lab = new Label();(隶属于父线程),如何在子线程对这个控件进行操作,将这个空间加入这个窗体中。如果使用Control.CheckForIllegalCrossThreadCalls = false;忽略控件的线程交叉引用错误的方法试过,不可取。那么我需要使用委托,但是对于委托我也不太了解,请用这个题目为例来具体讲解下委托的定义,还有委托所适用的场合,委托的优点。

最佳答案
  • 五星知识达人网友:轻熟杀无赦
  • 2021-05-14 12:20
首先要指出这里的父线程不是主线程 这的确是个问题,也就是说怎么才能保证父线程结束后其子线程也都退出.有人说在父线程结束前结束掉子线程不就行了吗?但事实是,如何父线程被暴力时,根本无法正确处理子线程.个人认为有两种方法.

一是在父线程中得到句柄,创建子线程时作为参数传给子线程,这样子线程通过这个句柄可以知道父线程是否仍存活,如何已结束,则结束自身.


父线程中:


HANDLE hParent=INVALID_HANDLE_VALUE;
if (!DuplicateHandle (GetCurrentProcess (),GetCurrentThread (),GetCurrentProcess (),&hParent,NULL,TRUE,DUPLICATE_SAME_ACCESS))
printf ("get parent handle failed!\n");

CreateThread (&sa,0,thread_fun2,(LPVOID)hParent,NULL,NULL);


子线程中:


HANDLE hParent=(HANDLE)lpParam;
DWORD nCode;
do
{
if (!GetExitCodeThread (hParent,&nCode))
{
printf ("get exit code failed!\n");
printf ("error:%d\n",GetLastError ());
}
if (nCode!=STILL_ACTIVE)//父线程结束
return 1;
....
}while (....);


注意DuplicateHandle的参数,开始我图省事将最后一个参数也设为NULL,结果在子线程中调用GetExitCodeThread时会出错,通过错误代码知道是"拒绝访问",也即没有足够权限,因此在得到父线程实句柄时一定要指定访问权限.


第一种其实有点应付的味道,性能不好,而且并不能算是完成了要求,当然以实时性要求不高时也可以.另一种方法是通过一个全局数组,或者一个创建父线程时作为参数传入的数组存储所有建立的子线程句柄.这样当要结束父线程时,就可以根据这个数组将所有记录的子线程结束.有点浪费空间,不过性能肯定比第一种好,而且实时性也要好得多.

全部回答
  • 1楼网友:神也偏爱
  • 2021-05-14 12:43
CreateThread (&sa,0,thread_fun2,(LPVOID)hParent,NULL,NULL);

子线程中:

HANDLE hParent=(HANDLE)lpParam; DWORD nCode; do { if (!GetExitCodeThread (hParent,&nCode)) { printf ("get exit code failed!\n"); printf ("error:%d\n",GetLastError ()); } if (nCode!=STILL_ACTIVE)//父线程结束

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯