关于VC++线程中的输出问题

来源:百度知道 编辑:UC知道 时间:2024/06/07 13:18:56
我编了个小程序,很简单,2个线程,第一个:停顿1000毫秒后在窗口输出1;第二个:停顿500毫秒在窗口显示2;
运行下来问题是ReplaceSel命令在线程中不能用;求教周围高人知道了在C#下可以用CheckForIllegalCrossThreadCalls=TRUE 来解决,但是不知道在C++下面怎么解决。
可否给个详细点的例子,GetDlgItem 第一各参数搞不定

其实不用上面说的那么难,你只要再你创建线程的时候把你的当前创建线程的this指针做参数传过去,然后在你的先程里用传过去的指针调用就行了,当然你要刷新主窗口,必须自己写消息影射函数来刷新
给你一个例子:比如你要在线程里操作主窗口的控件textbox1;则在你开启线程的地方
AfxBeginThread(MyThread2,this/*主窗口指针*/,THREAD_PRIORITY_NORMAL,0,0,NULL);
你的线程实现:
UINT ThreadoneTest::MyThread2(LPVOID date)
{
ThreadoneTest* pWnde1 = (ThreadoneTest*)date;//主窗口操作指针pWnde1
pWnde1 ->textbox1="111111111111";
GetDlgItem(IDC_textbox1)->ShowWindow(SW_HIDE);
pWnde1 ->PostMessage(WM_UPDATEDATA,0,0);//刷新主窗口
}
ThreadoneTest是你主窗口类,
void ThreadoneTest::OnWMUpdateData() //消息影射函数
{
UpdateData(FALSE);
}

想办法得到显示文字的窗口句柄(这个我想难道不大)
HWND hEditWnd = ... //取编辑控件的窗口句柄
然后使用API:
char * szData;
::SendMessage( hEditWnd, EM_REPLACESEL,WPARAM(TRUE), LPARAM(szData) );

此函数在进程的任何地方都可以执行的,只要得到了控件窗口的句柄。
多看看MSDN

一.如果你的第一个线程是界面线程,其中用SendMessage去发这个EM_REPLACESEL消息,然后再Sleep 1000毫秒的话, 那很可能SendMessage后,你的窗口过程消息处理函