关于主线程获得子线程的返回值问题(100分)

  • 主题发起人 主题发起人 kusanagi
  • 开始时间 开始时间
K

kusanagi

Unregistered / Unconfirmed
GUEST, unregistred user!
比如说一个主线程函数需要根据三个参数进行运算p1,p2,p3,并根据计算结果进行处理。
而对p1,p2,p3的运算是在t1,t2,t3这三个线程中完成的,
如何写这个函数才能同时执行这三个线程,并等待三个线程执行完毕后对三个结果进行处理?
 
你可以在主線程內設置一個子線程計數變量。在每CreateThread使該變量自己一加1,線程完時在那計數減一,主線程就是檢測這個變量計數是否為零,為零的時候就是說明這三個線程已經完成。接下來就做你想做的處理。
注意,計數變量在加1和減1的時候要用TRTLCriticalSection來進行保護起來以確保同步

 
可以在主线程中建立消息队列,子线程执行完后向主线程发消息
 
迷糊的方法简单可行
 
可以写的四个线程判断前三个是否结束。
 
用 全局变量
也可以在 Create 时多传几个参数过去,TThread 有返回值的。
你看看。
 
迷糊的方法应该行不过要注意同步,弄不好就会出错。
 
转贴一段
信号量核心对象用于资源计数。它为线程提供了查询可用资源数目的能力;如果有一个或多个资源可用,可用资源就减1。信号量自动进行测试和设置操作。也就是说,当你从一个信号量请求资源时,操作系统将检查该资源是否可用,并将其计数减1,在此期间任何别的线程都不能打扰。只有在资源计数减1后,系统才会让别的线程访问此资源。
例如:假如一个计算机有3个串口,那么在任何给定的时间内不能有超过3个的线程去访问串口。这时就可以使用信号量。当信号量的访问计数大于0时它是有信号的,而当它等于0时是无信号的。每当线程调用WaitForSingleObject并传入信号量的句柄,系统将检查此信号量的引用计数是否大于0。如果是,系统将引用计数减1并唤醒此线程;若引用计数是0,系统使线程进入睡眠,直到另一个线程释放了此信号量。
由于若干个线程能够运行信号量的资源计数,所以和互斥量和临界区不同,信号量不被认为是由任何线程拥有的。
1、 创建信号量
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName );
此函数创建一个引用计数最大是lMaximumCount的信号量。LInitialCount指定信号量的初始引用计数。LpName指定引用计数的名字。通过它可以在进程中调用CreateSemaphore或OpenSemaphore时使用这个名字以得到此信号量的句柄:HANDLE OpenSemaphore(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName name );

2、 释放信号量
释放信号量是通过:
BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount
);
任何线程都可以在任何时刻调用此函数,因为信号量不被任何线程所拥有。ReleaseSemaphore可以通过lReleaseCount参数指定一次把信号量释放多少。最后一个参数pPreviousCount是一个长整数指针,在把lReleaseCount加到引用计数前,ReleaseSemaphore先将引用计数的值填入此参数中。
3、关闭信号量
关闭信号量使用CloseHandle。
 
var
Hand:THandle;
begin
Hand:=CreateEvent(nil,True,False,nil);
SetEvent(Hand);
WaitForSingleObject(Hand,1000);
CloseHandle(Hand);
end;
参考这些命令了。
 
让3个线程的FreeOnTerminate都为False.
var
ThreadHandles: array[0..2] of THandle;
begin
ThreadHandles[0] := YourThread1.Handle;
ThreadHandles[1] := YourThread2.Handle;
ThreadHandles[2] := YourThread3.Handle;
WaitForMultipleObjects(3, @ThreadHandles, True, INFINITE);
YourThread1.Free;
YourThread2.Free;
YourThread3.Free;
end;
 
后退
顶部