在窗体上创建的空间Label lab = new Label();(隶属于父线程),如何在子线程对这个控件进行操作,将这个空间加入这个窗体中。如果使用Control.CheckForIllegalCrossThreadCalls = false;忽略控件的线程交叉引用错误的方法试过,不可取。那么我需要使用委托,但是对于委托我也不太了解,请用这个题目为例来具体讲解下委托的定义,还有委托所适用的场合,委托的优点。
如何在子线程中访问父线程的空间
- 提问者网友:沉默的哀伤
- 2021-05-14 11:19
- 五星知识达人网友:轻熟杀无赦
- 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
子线程中:
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)//父线程结束