Articles of multithreading

没有“跨线程”,我可以从BackgroundWorker访问什么?

我意识到我无法从BackgroundWorker的DoWork事件处理程序访问表单控件。 (如果我尝试,我得到一个exception,如预期)。 但是,我允许访问我的窗体上存在的其他(自定义)对象吗? 例如,我创build了一个“设置”类,并在我的窗体中实例化它,我似乎可以读取和写入它的属性。 这只是运气,这是有效的? 如果我有一个静态类,怎么办? 我能够安全地访问吗?

_beginthread与CreateThread

Windows中的CreateThread和beginthread API有什么区别? 哪一个更适合创build线程?

了解MsgWaitForMultipleObjects

我有一个主要的gui线程,我想保持响应用户的行动,如移动对话框,resize等,而我有一个后台线程做一些任务。 在过去,我使用WaitForSingleObject超时,以便在完成后台线程等待时处理GUI事件。 我最近阅读了关于MsgWaitForMultipleObjects的文章,这个文章看起来解决了我有点干净的问题。 有人能告诉我在下面的代码中的错误和我要去哪里错了吗? 当我点击button启动线程时,gui没有反应。 我做了一个对话框的应用程序,正在播放主要的UI线程。 我有一个button来启动一个线程,并使用MsgWaitForMultipleObjects等待线程句柄,但是当线程完成/发送信号时,允许所有的消息最终被处理。 谢谢。 UINT MyThreadProc( LPVOID pParam ) { ThreadData* pObject = (ThreadData*)pParam; if (pObject == NULL || !pObject->IsKindOf(RUNTIME_CLASS(ThreadData))) return 1; // Do some processing. int x = 0; while (x++ < 5000) { for (int i=0; i<50000; i++) double sum = sqrt((double)i+1) * sqrt((double)i+2); } return 0; } button处理程序 […]

我需要一个消息泵,不会弄乱我打开的窗口

我的应用程序(我正在使用的安装程序的引导程序应用程序需要启动一些其他应用程序(我的安装程序和第三方安装程序的安装程序的先决条件),并等待它们完成。为了允许GUI执行屏幕更新在等待一个应用程序完成的时候,我使用Visual Studio文档中关于空闲循环处理的'兼容MFC'的例子,在等待循环中放置了一个消息泵作为指导。我的代码(在CWinApp的成员函数中派生类)如下: if (::CreateProcess(lpAppName, szCmdLineBuffer, NULL, NULL, TRUE, 0, NULL, NULL, &StartupInfo, &ProcessInfo)) { ::GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode); if (bWait) while (dwExitCode == STILL_ACTIVE) { // In order to allow updates of the GUI to happen while we're waiting for // the application to finish, we must run a mini message pump here to // allow messages […]

如何使用SleepEx的可靠警报和整体最低睡眠时间?

我有以下用例:我当前的线程需要执行operation1 ,等待一些时间与其他人协调,然后需要做operation2 。 在等待之间,由于文件系统事件,APC可能需要由该线程处理,在当前线程完成operation2之后,APC将稍后向另一个队列添加另一个operation1 。 简单的如下: while (true) { processOperation1; SleepEx(…, true); processOperation2; } 重要的是,在operation1和operation2之间,必须至less经过指定的SleepEx时间! 这不需要是一个整体,线程可以立即用于处理APC并排队另一个operation1 ,除非指定的时间已过,否则它不应该继续operation2 。 从文档 : 如果参数为TRUE,并且调用此函数的线程与调用扩展I / O函数(ReadFileEx或WriteFileEx)的线程相同,则函数在超时时间已过或I / O完成callbackfunction发生。 如果发生I / O完成callback,则调用I / O完成function。 如果一个APC排队到该线程(QueueUserAPC),则该函数在定时器溢出时间已过或调用APC函数时返回。 根据我的理解,这意味着如果SleepEx被调用并且APC已经排队,那么直接由当前线程执行,因为它有这个能力。 但是之后SleepEx之后的代码会发生什么? 线程是否返回到进程operation2是因为SleepEx返回了控制权还是线程回到睡眠状态,在SleepEx停留,直到经过指定的时间量? 文档中的第一句话并不是说从函数返回,而是“恢复线程”: 挂起当前线程直到满足指定的条件。 发生以下情况之一时,执行继续: 这可能意味着线程恢复,处理APC,然后停留在SleepEx ,hibernate所需的任何时间量。 如果情况并非如此,那么SleepEx是否真的离开了,这是否说明已经过了多长时间? SleepEx似乎没有提供该值,但只有一些不变的返回值。 这听起来像我需要在我自己的SleepEx之前和之后需要时间,并一次又一次地调用该函数,直到我真正需要的时间已经过去? 有没有像这样的东西,也许是作为boost一部分? 谢谢!

如何在c / c ++中asynchronous运行线程的特定函数?

性能调优:将数据写入多个pipe道 现在我正在做一个单一的线程: for(unsigned int i = 0; i < myvector.size();) { tmp_pipe = myvector[i]; fSuccess = WriteFile( tmp_pipe, &Time, sizeof(double), &dwWritten, NULL ); if(!fSuccess) { myvector.erase(myvector.begin()+i); printf("Client pipe closed\r\n"); continue; } fSuccess = WriteFile( tmp_pipe, &BufferLen, sizeof(long), &dwWritten, NULL ); if(!fSuccess) { myvector.erase(myvector.begin()+i); printf("Client pipe closed\r\n"); continue; } fSuccess = WriteFile( tmp_pipe, pBuffer, BufferLen, &dwWritten, […]

Windows的gcc端口thread_posixs和thread_win32之间的区别是什么?

我想下载适用于windows的最新版本的gcc 4.7.2编译器。 当我到了这个页面 ,我应该看到一个下载链接,我面对两个类别: 线程,POSIX 线程-win32的 这两个有什么区别? 它们只是线程实现吗?我的意思是它们只是在实现方式上有所不同,因此最终结果(类,如何使用它们等)保持不变。 还是他们强加一个特定的编码风格?

Visual C ++中的Pthreads

我在Windows中尝试multithreading,并想知道我是否应该 使用Win32 API 使用Windows的POSIX线程 如果我尝试在不同的平台上开发这样的应用程序,学习Pthreads将会很有用,但是如果不学习Win32 API,我会失去什么? 还是都是相似的,以便学习一个让我找出对方很容易?

在Windows上互斥,临界区等的成本

我在某处读到一个互斥量的开销并不多,因为上下文切换只发生在争用的情况下。 在Linux中也称为互斥体。 在Windows中相同的东西是否保持良好? Critical Section是关于Linux中互斥体的更贴图。 从我所收集的内容来看,临界区与Mutex相比提供了更好的最佳性能,对于每一种情况都是如此? 在Windows中是否存在互斥体比临界区快的情况? 假设只有一个进程 – 线程正在访问互斥体(只是为了消除关键部分的其他好处) 补充信息:OS的Windows服务器, 语言C ++

解决太多静态链接CRT的限制?

当通过LoadLibrary加载外部DLL(不在我们的控制下)时,我们遇到了一个问题,那些DLL中的静态链接CRT无法分配光纤本地存储。 这与mskb 193462类似,只是这是FLS,只有128个。 有没有什么有用的方法来解决这个问题? CRT使用GetProcAddressfindFlsAlloc无论如何(因为这显然从来没有在XP中),所以它甚至真的需要它? (这是在Vista中,其中FlsAlloc实际存在; DLL似乎使用MSVC8)