- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在深入研究 MFC 的世界,特别是自定义使用 CWinThread 来实现辅助线程。我已经通过其他方式成功实现了工作线程,因此将 CWinThread 用于工作线程的主要动机是利用消息映射。
为了将来的使用,我将 CWinThread 派生到最终将成为某种形式的父类(super class)中。请参阅以下声明。
class WinThreadBase : public CWinThread
{
DECLARE_DYNCREATE(WinThreadBase)
protected:
WinThreadBase(); // protected constructor used by dynamic creation
DECLARE_MESSAGE_MAP()
public:
BOOL isdone_;
};
这由以下扩展和实现
声明
class WinThreadImplementation :public WinThreadBase {
DECLARE_DYNCREATE(WinThreadImplementation)
protected:
WinThreadImplementation(); //Declare protected because of dynamic creation
public:
//The following CWinThread methods have to be overriden to complete specfic work.
virtual BOOL InitInstance();
virtual int Run();
private:
CDialog* owner_;
BOOL isinit_;
public:
virtual ~WinThreadImplementation();
void SetOwner( CDialog* pOwner ) { owner_ = pOwner; }
BOOL Isinit() const { return isinit_; }
DECLARE_MESSAGE_MAP()
//Message handler declaration
void OnMyThreadMessage( WPARAM wParam, LPARAM lParam );
void OnQuit( WPARAM wParam, LPARAM lParam );
};
实现
IMPLEMENT_DYNCREATE( WinThreadImplementation, WinThreadBase)
WinThreadImplementation::WinThreadImplementation() {
owner_ = FALSE;
isinit_ = FALSE;
}
WinThreadImplementation::~WinThreadImplementation() {
//........Do some stuff here... //
}
BOOL WinThreadImplementation::InitInstance() {
//Do some initialisation here..
return TRUE; //returning true allows thread start successfully
}
int WinThreadImplementation::Run() {
isinit_ = TRUE;
while( !isdone_ ) {
//Do some work...
//TRACE( "Hello from pat's derived CWinThread" );
Sleep( 1000 ); //Give other threads a chance to run..
}
owner_->PostMessage( WM_QUIT, 0, 0 ); // Tell our parent thread that this thread has finished work
return 0;
}
BEGIN_MESSAGE_MAP(WinThreadImplementation,CWinThread)
//Map messages to handler method here...
//CWinThread messages must be handles like this....
ON_THREAD_MESSAGE(WM_MYTHREADMESSAGE,OnMyThreadMessage)
END_MESSAGE_MAP()
//Put message handlers here...`
void WinThreadImplementation::OnMyThreadMessage( WPARAM wParam, LPARAM lParam ) {
TRACE( "Hello from my message handler\n\r" );
}
现在真正发布消息
mywinthreadimpl_ = (WinThreadImplementation*)
AfxBeginThread( RUNTIME_CLASS( WinThreadImplementation ), THREAD_PRIORITY_NORMAL,
0, CREATE_SUSPENDED );
mywinthreadimpl_->SetOwner( this );
mywinthreadimpl_->ResumeThread();
while( !mywinthreadimpl_->Isinit() ); //Make sure that the thread has initialised before attempting to post a message
if( PostThreadMessage( mywinthreadimpl_->m_nThreadID, WM_MYTHREADMESSAGE, NULL, NULL ) ) {
TRACE( "message was sent correctly\n" );
}
所以它的结果是编译,我的 CWinThread 派生正在工作并进入覆盖的运行函数。但是我这辈子都收不到 PostThreadMessage 发布的消息。
我已阅读以下内容
http://support.microsoft.com/kb/142415?wa=wsignin1.0
并得出结论,这不适用于我,因为我使用的是 VS 2010。
任何人都可以建议我可能遗漏了什么,这会阻止我的 CWinThread 实现接收消息吗?
谢谢
最佳答案
如果不使用 AfxPumpMessage 或调用 CWinThread (__super::Run) 的基类实现,您将永远不会收到消息!
不要使用 isdone_。而是使用 PostQuitMessage 来终止当前的工作线程。只需使用 Run 的基本实现来运行线程并发送消息。
您还可以使用 OnIdle 或 CWinThread 的其他功能,来做一些工作...
只是调用 Sleep 会阻塞你的线程,但线程永远不会被 Windows 消息打断
关于c++ - CWinThread 消息映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28430714/
所以我正在深入研究 MFC 的世界,特别是自定义使用 CWinThread 来实现辅助线程。我已经通过其他方式成功实现了工作线程,因此将 CWinThread 用于工作线程的主要动机是利用消息映射。
我有一个非常简单的问题,关于 CWinThread 如何工作以及每次调用 ResumeThread() 时入口点在哪里。我正在寻找一个看起来类似于“主”函数的条目,我可以在其中执行一些操作和分支。 我
我有这样的代码 X *m = new X(); // X - class derived from CWinThread; m->CreateThread(CRREATE_THREAD); m->b_
如您所知,可以在 MFC UI 线程中指定 OnIdle。详情可以看这篇引用http://msdn.microsoft.com/en-us/library/1sa2f19f.aspx .但我不确定如何
我有一个 C++ 应用程序 (VS2008),我这样启动线程: CWinThread *myThread= AfxBeginThread(myOp,0); 现在我要做的就是给这个线程命名,这样我就可以
我正在使用 MFC C++,我正在尝试使用来自 Dlg 类的 PostThreadMessage 将消息发送到 CWinThread,但该消息未在线程类上处理 线程的.H文件: #define
当我调试用 C++ 开发的 Windows 应用程序时,我发现这个函数调用 CWinThread::PumpMessage()。我读过 MSDN以及其他一些要了解的论坛帖子。但仍然不确定它的作用。 有
在我的项目中,我有管理类和计算类。从 CWinThread 派生的 calc 类。和 manager 有一个指向 calc 类的指针。我如何使用 AfxBeginThread 以及在哪里使用?请注意,
我有一个通过 AfxBeginThread 生成线程的循环,它将 CWinThread 指针存储在一个数组中。在每次迭代中,我检查线程是否为空并将线程的句柄存储在另一个数组中。 const unsig
我正在尝试在名为 ClientManager 的类中创建工作线程,但我无法从新的 CWinThread 访问 AfxGetMainWnd(),即: UINT ClientManager::Worker
我正在使用 AfxBeginThread 启动一个线程。这将返回一个指向新的 CWinThread 对象的指针。 MSDN 声明此指针为 NULL,如果线程创建失败,它将释放所有内容。但是,一旦线程在
我正在调用 AfxBeginThread 并使用 CWinThread 在我的 MFC 应用程序中启动一个 UI 线程。 我注意到,如果我的主线程在 CWinThread::InitInstance(
我想知道在 MFC 中使用 CWinThread 派生类作为工作线程的过程是什么。 msdn 文档说 CWinthread::InitInstance() 或 CWinthread::Run() 应该
我正在处理一些遗留代码,这些代码使用 MFC 的 UI 线程来实现管理器线程-工作线程机制。代码过去在 MFC GUI 应用程序下运行,但现在它在一个单独的 dll 中,并且可以从 GUI 应用程序和
我是一名优秀的程序员,十分优秀!