在界面线程不能使用Sleep和WaitForSingleObject之类的函数

219 篇文章 ¥19.90 ¥99.00
在主线程使用WaitForSingleObject会导致消息循环阻塞,造成界面假死。SetDlgItemText通过SendMessage进行更新,而主线程被阻塞无法处理消息,形成死锁。应避免在界面线程使用此类函数,改用线程结束时发送消息通知主线程的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你在主线程用了WaitForSingleObject,导致了消息循环的阻塞,界面假死。然后在线程中调用了SetDlgItemText,而SetDlgItemText实际上调用的是SendMessage,而SendMessage要等待主线程处理完毕发送的消息才返回继续执行,而你主线程的消息循环已经阻塞,无法处理消息,导致整个过程“我等你,你等我”,无穷下去

在界面线程不能使用Sleep和WaitForSingleObject之类的函数,比较好的方法是,将句柄作为线程参数传递进线程,当线程结束后发一条消息通知主线程处理完毕
在C++或Windows环境下,你可以使用`<windows.h>`库中的函数来实现这个需求。下面是一个简单的示例代码,展示了如何创建、控制退出一个子线程: ```cpp #include <iostream> #include <windows.h> // 包含Windows API函数 DWORD WINAPI ThreadFunction(LPVOID lpParam) { // 把LPVOID类型的lpParam转换为void*,以便打印字符串 char* str = static_cast<char*>(lpParam); std::cout << "Thread is running!\n"; // 挂起线程10秒 Sleep(10 * 1000); // 使用Sleep函数线程休眠10秒 // 显示线程即将结束的信息 std::cout << "Thread will exit now.\n"; // 使用ExitThread()函数终止线程 ExitThread(0); // 返回值0表示成功退出 return 0; // 这一行不会被执行,因为线程已经退出 } int main() { // 创建一个线程,传入"Thread is running!"作为参数 char threadMessage[] = "Thread is running!"; HANDLE hThread = CreateThread(NULL, 0, ThreadFunction, threadMessage, 0, NULL); if (hThread == NULL) { std::cerr << "Failed to create thread: " << GetLastError() << std::endl; return 1; } // 等待子线程完成 WaitForSingleObject(hThread, INFINITE); // 主线程继续执行,理论上这应该检查线程退出状态 std::cout << "Main thread finished.\n"; CloseHandle(hThread); // 关闭线程句柄 return 0; } ``` 在这个例子中,我们首先定义了一个线程函数`ThreadFunction()`,它接收一个指向字符串的指针并依次执行相应的操作。然后,在`main()`函数中,我们调用`CreateThread()`创建一个新的线程,传递我们的消息给它,并等待该线程完成。 请注意,Windows API的线程处理可能会有所不同,上述代码假设你的环境支持这些函数。如果你是在其他操作系统上工作,例如Linux,线程API可能会有所差异。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值