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

2025-05-03 11:53:54
推荐回答(2个)
回答(1):

一.如果你的第一个线程是界面线程,其中用SendMessage去发这个EM_REPLACESEL消息,然后再Sleep 1000毫秒的话, 那很可能SendMessage后,你的窗口过程消息处理函数还来不及处理这个EM_REPLACESEL就进入睡眠状态了,也就是说不能及时显示出 1, 同样,你的第二个线程虽然不是界面线程,但它也是通过SendMessage去让界面线程处理这个消息的话,那如果碰巧你的界面线程正在睡眠,那自然也不能及时显示出 2

二.GetDlgItem的第一个参数是你的对话框窗口上的控件的资源ID,比如
IDC_EDIT1

回答(2):

其实不用上面说的那么难,你只要再你创建线程的时候把你的当前创建线程的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);
}