我有一个Win32原生VC++应用程序,在进入WinMain()
时启动一个单独的线程,然后在其他线程运行时执行一些有用的工作,然后简单地退出WinMain()
- 另一个线程没有明确停止.
这篇博文说,在这种情况下.NET应用程序不会终止,因为另一个线程仍在运行.这同样适用于本机Win32应用程序吗?
退出前我是否必须停止所有线程?
我有一个Delphi应用程序,它在一些TTimer.OnTimer事件中产生了6个匿名线程.
如果我从标题栏中的X按钮关闭应用程序,则会引发地址$ C0000005处的访问冲突,并且FastMM报告泄漏的TAnonymousThread对象.
哪个是使用TThread.CreateAnonymousThread()方法在OnTimer事件中创建的Delphi中释放匿名线程的最佳方法?
解决方案对我有用:
创建了一个匿名线程的包装器,它在被Free-ed时终止它们.
type
TAnonumousThreadPool = class sealed(TObject)
strict private
FThreadList: TThreadList;
procedure TerminateRunningThreads;
procedure AnonumousThreadTerminate(Sender: TObject);
public
destructor Destroy; override; final;
procedure Start(const Procs: array of TProc);
end;
{ TAnonumousThreadPool }
procedure TAnonumousThreadPool.Start(const Procs: array of TProc);
var
T: TThread;
n: Integer;
begin
TerminateRunningThreads;
FThreadList := TThreadList.Create;
FThreadList.Duplicates := TDuplicates.dupError;
for n := Low(Procs) to High(Procs) do
begin
T := TThread.CreateAnonymousThread(Procs[n]);
TThread.NameThreadForDebugging(AnsiString('Test thread N:' + IntToStr(n) + ' TID:'), T.ThreadID);
T.OnTerminate := AnonumousThreadTerminate;
T.FreeOnTerminate := true; …
Run Code Online (Sandbox Code Playgroud)