相关疑难解决方法(0)

是否有必要在退出Win32应用程序之前显式停止所有线程?

我有一个Win32原生VC++应用程序,在进入WinMain()时启动一个单独的线程,然后在其他线程运行时执行一些有用的工作,然后简单地退出WinMain()- 另一个线程没有明确停止.

这篇博文说,在这种情况下.NET应用程序不会终止,因为另一个线程仍在运行.这同样适用于本机Win32应用程序吗?

退出前我是否必须停止所有线程?

windows winapi multithreading visual-c++

10
推荐指数
2
解决办法
5913
查看次数

如何在应用程序关闭时终止Delphi中的匿名线程?

我有一个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)

delphi multithreading anonymous terminate delphi-xe2

8
推荐指数
2
解决办法
1万
查看次数