草庐IT

线程不安全

全部标签

windows - 当前线程的 SetWindowsHookEx 返回 null

我在尝试为当前线程获取键盘钩子(Hook)时遇到问题。首先,我需要为所有线程获取键盘输入,所以我使用了:hHook=SetWindowsHookEx(WH_KEYBOARD_LL,mKeyboardProc,GetModuleHandle(NULL),0);这工作正常,但是当我尝试将dwThreadId参数(最后一个)设置为GetCurrentThreadId()时,SetWindowsHookEx返回NULL。可能是什么问题?谢谢。 最佳答案 WH_KEYBOARD_LL是一个全局钩子(Hook),如documentation中所

c++ - n>0 的 Sleep(n) 是否将 CPU 时间放弃给其他线程

在windows下使用VC++13,联机帮助指出使用Sleep(0)会将当前线程时间片的剩余部分放弃给具有同等优先级的任何其他线程。其他值也是如此吗?例如如果我使用Sleep(1000),则当前线程运行的内核有1000毫秒的CPU时间可能会被另一个线程使用?我想这是特定于硬件和实现的,因此为了缩小范围,假设是IntelI5或更好的Windows7或8。问的原因是我有一个线程池类,我正在使用一个额外的监视器线程来报告进度,允许用户中止长进程等... 最佳答案 是的,零只有在表示没有最短等待时间的情况下才具有特殊含义。通常它可以被解释为

c - Windows线程接受套接字上的连接

我熟悉pthreads,但不熟悉Windows线程。在Linux中,一个新线程可以这样启动:pthread_ttid;intrc=pthread_create(&tid,NULL,Threadfn,&newsocket);assert(rc==0);////和Threadfn可以轻松重构Socket:void*Threadfn(void*vargp){pthread_detach(pthread_self());int*Socket=(int*)vargp;print("Socketis%d\n",*Socket);//recv/read/sendetc..pthread_exit(N

c# - 在 Windows 窗体中,如何在用户单击滚动条时阻止 UI 线程阻塞?

除了面板的滚动条等,没有其他控件可以做到这一点。单击并按住按钮、标签、链接、选项卡,任何其他控件都没有此效果。但是只要用户单击滚动条,或者单击并拖动滚动条,UI线程上的所有其他处理就会停止。这对我的应用程序(一个游戏,需要在这种情况下继续运行)来说是个大问题,但我想不出一种方法来通过重载、添加Application.DoEvents调用或任何方式来处理这个问题像那样。有什么想法吗? 最佳答案 在我看来,您应该尝试将您的游戏逻辑移到另一个线程中(而不是让您的游戏逻辑在主UI线程中运行)。我认为没有任何方法可以禁用滚动条的行为。除非您创

c++ - 在 Win32/MFC 和 POSIX 中,线程会自行清理吗?

我正在使用C++和Boost开发一个多线程程序。我正在使用辅助线程来异步初始化资源。如果我分离线程并且对线程的所有引用都超出范围,我是否泄漏了任何资源?还是线程会自行清理(即它的堆栈和自身所需的任何其他系统资源)?根据我在文档中看到的内容(以及我8年前从pthreads中记忆的内容),不需要进行明确的“销毁线程”调用。我希望线程异步执行,当需要使用资源时,我会检查是否发生错误。粗略的代码看起来像这样://Assumethiswon'tgetcalledfrequentlyenoughthatnext_resourcewon'tgetpromoted//beforethethreadfi

Windows 和 Linux 线程优先级等价

Windows操作系统将以下常量定义为线程优先级:THREAD_PRIORITY_IDLE(-15)THREAD_PRIORITY_LOWEST(-2)THREAD_PRIORITY_BELOW_NORMAL(-1)THREAD_PRIORITY_NORMAL(0)THREAD_PRIORITY_ABOVE_NORMAL(1)THREAD_PRIORITY_HIGHEST(2)THREAD_PRIORITY_TIME_CRITICAL(15)Linux有sched_get_priority_max()和sched_get_priority_min()来获取线程优先级范围。Windows

c++ - 是否可以使用 c/c++ 创建一个即使主线程在 Windows 中退出也不会退出的线程?

如上图所示,一旦主线程死亡,所有其他线程将自动退出。是否可以创建一个永不死亡的线程? 最佳答案 你可以,但你可能不应该;它只会让人们感到困惑。Hereisagoodexplanation这是如何与Win32和CRT一起工作的。 关于c++-是否可以使用c/c++创建一个即使主线程在Windows中退出也不会退出的线程?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3695400

c# - 从线程启动时模态弹出窗口失败——CSharp WPF

要批量上传多个文件,我有一段CSharpWPF代码,它生成线程以允许并行上传文件。如果上传发生错误,将使用MessageBox弹出一条消息。这很好用。但最近我们决定自定义MessageBox的外观。我发现当使用ShowDialog()打开我们新的自定义WPFMessageBox窗口时会抛出一个错误,提示无法启动GUI。这仅在派生线程中的代码尝试打开自定义消息窗口时发生——当从主线程打开自定义消息框时我没有看到问题。我的临时解决方法是捕获自定义对话框启动时发生的任何错误,并选择调用标准MessageBox.Show()来显示消息。行得通。我不确定为什么可以使用标准MessageBox.S

windows - 在 64 位 Windows 应用程序中获取 TID(线程信息 block )的最快方法?

我有一个计算密集型模块,我在其中添加了堆栈跟踪以便能够找到特定问题。尽管启用此堆栈跟踪时允许应用程序运行得更慢,但它不能运行慢10倍。这就是为什么我不使用DBGHELP.DLL中的StackWalk例程,而是使用帧指针自己遍历堆栈(因此我不使用FramePointerOmission编译器选项)。在大多数情况下,获取调用堆栈工作正常并且非常快,但在某些情况下,我的逻辑会失败,因为其中一个帧指针指向堆栈外的地址(不多,只是一点点)。我知道这可能是某个地方的错误,但为了能够使我的代码更安全,我需要一种方法来检查帧指针是否指向当前线程堆栈中的内存位置。该应用程序为64位,可在Windows下

带参数的 C++ 简单线程(无 .net)

我已经在互联网上搜索了一段时间并找到了不同的解决方案,但后来都没有真正起作用或者对我的使用来说太复杂了。直到2年前我才使用C++,所以它可能有点生疏:D我目前正在编写一个将数据发布到URL的程序。它只发布数据。为了发布数据,我使用curl,但它会阻塞主线程,并且当第一个帖子仍在运行时,第二个帖子应该开始。最后大概有5-6个post操作同时运行。现在我想将带有curl的帖子推送到另一个线程中。每个帖子一个线程。线程应该得到一个字符串参数,其中包含要推送的内容。我目前被困在这个问题上。尝试了Windows的WINAPI,但在读取参数时崩溃了。(在我的示例中,第二个线程仍在运行,而主线程结束