- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的应用程序创建了一个线程并一直在后台运行。我只能手动终止线程,不能从线程回调函数中终止。目前我正在使用 TerminateThread()
来终止该线程,但它有时会导致它挂起。我知道有一种方法可以使用事件和 WaitForSingleObject()
使线程正常终止,但我找不到相关示例。
拜托,这里需要代码。
最佳答案
TerminateThread 是个坏主意,尤其是当您的线程使用同步对象(如互斥体)时。它会导致未释放的内存和句柄以及死锁,因此您需要做一些其他事情是正确的。
通常,线程终止的方式是从定义线程的函数返回。主线程使用一个事件对象或一个简单的 bool 值(如果检查频率足够高的话)向工作线程发出退出信号。如果工作线程等待 WaitForSingleObject
,您可能需要将其更改为 WaitForMultipleObjects
,其中一个对象是一个事件。主线程将调用 SetEvent
,工作线程将唤醒并返回。
除非您向我们展示您在做什么,否则我们真的无法提供任何有用的代码。根据工作线程正在做什么以及您的主线程如何向它传递信息,它看起来可能会有很大不同。
此外,在 [now very old] MSVC 下,您需要使用 _beginthreadex
而不是 CreateThread
以避免 CRT 中的内存泄漏。参见 MSKB #104641 .
更新:
工作线程的一个用途是作为“计时器”,定期执行一些操作。在最微不足道的地方:
for (;;) {
switch (WaitForSingleObject(kill_event, timeout)) {
case WAIT_TIMEOUT: /*do timer action*/ break;
default: return 0; /* exit the thread */
}
}
另一个用途是按需做一些事情。基本相同,但超时设置为 INFINITE
并在 WAIT_OBJECT_0
而不是 WAIT_TIMEOUT
上执行一些操作。在这种情况下,您需要两个事件,一个使线程唤醒并执行某些操作,另一个使线程唤醒并退出:
HANDLE handles[2] = { action_handle, quit_handle };
for (;;) {
switch (WaitForMultipleObject(handles, 2, FALSE, INFINITE)) {
case WAIT_OBJECT_0 + 0: /* do action */ break;
default:
case WAIT_OBJECT_0 + 1: /* quit */ break;
}
}
请注意,如果 WFSO/WFMO 返回错误而不是预期结果之一,则循环执行合理的操作很重要。在上面的两个示例中,我们只是将错误视为我们已收到退出信号。
您可以通过从主线程关闭事件句柄来获得与第一个示例相同的结果,从而导致工作线程从 WaitForSingleObject
获取错误并退出,但我不推荐这种方法.
关于c - 不使用 TerminateThread() 优雅地终止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1702172/
我有一个应用程序,它通过 SetConsoleCtrlHandler 注册了句柄例程。事情是中断信号我必须在退出前做一些清理,这就是问题开始的时候。因为,其他线程继续运行并使用一些应该释放的资源,我在
所以我一直在学习 Windows API 中的线程,我写了一些测试代码,但我遇到了一些问题。首先我有两个功能: DWORD WINAPI MyThreadFunction( LPVOID lpPara
如何释放调用 TerminateThread 后剩余的虚拟内存?可以通过 VirtualFree 完成吗?当然如何。我完全理解 TerminateThread 的“危险”。 最佳答案 在非托管进程中,
我有一个使用 CreateThread 函数创建的 ThreadA。在 ThreadA 内部,另一个线程 ThreadB 是使用 CreateThread 函数创建的。 现在,我想从 ThreadA
如果我在 Windows 上使用 TerminateThread 终止线程函数,该线程是在函数返回后实际终止还是异步终止? 最佳答案 定义“实际终止”。文档说该线程不能再执行任何用户模式代码,如此有效
我的应用程序创建了一个线程并一直在后台运行。我只能手动终止线程,不能从线程回调函数中终止。目前我正在使用 TerminateThread() 来终止该线程,但它有时会导致它挂起。我知道有一种方法可以使
调用TerminateThread时,即使线程处于挂起状态,线程也会终止吗? 最佳答案 TerminateThread function销毁线程而不考虑其状态或可能的副作用。链接的 MSDN 页面对此
我使用 CreateThread 然后使用 TerminateThread 来取消线程。看起来堆栈空间仍然被分配。有办法解决这个问题吗?我没有使用任何形式的动态内存调用,例如 malloc/new。线
由于restrictions on DllMain(我知道这对DLL中的全局和静态对象构造函数和析构函数同样适用),像带异步文件写入/刷新线程的单例记录器这样的简单事情变得太棘手了。单例记录器位于DL
我有这个代码需要使用,但阻碍我的是 here它说 TerminateThread 适用于:仅桌面应用程序。我想知道是否可以在 azure Worker 角色中使用此代码,特别是在我用来运行 Worke
我有这个代码需要使用,但阻碍我的是 here它说 TerminateThread 适用于:仅桌面应用程序。我想知道是否可以在 azure Worker 角色中使用此代码,特别是在我用来运行 Worke
这个问题在这里已经有了答案: How to get the winapi id of a thread that has been created using the standard librar
如果我从 C++ 代码调用 TerminateThread,那么稍后我会收到 FatalExecutionEngineError MDA。该错误主要发生在我对字符串执行不同的操作(即 concat)时
我创建了创建两个线程的简单测试;第一个 (WorkerThreadFun) 执行无限循环,第二个 (WorkerGuardThreadFun) 以小超时终止它。 要终止的线程似乎没有进行显式分配(至少
我是一名优秀的程序员,十分优秀!