MFC线程传输文件问题,
我要通过一个按钮按下之后就送文件,但是因为文件比较大,如果在按钮函数下直接传送因为while比较多,所以会导致MFC假死,所以想开一个线程传送,可是问题来了,主线程和se...
我要通过一个按钮按下之后就送文件,但是因为文件比较大,如果在按钮函数下直接传送因为while比较多,所以会导致MFC假死,所以想开一个线程传送,可是问题来了,主线程和send(就是我按下按钮之后创建的线程)因为不停的切换,导致速度很慢,有什么办法让主线程一直到send线程送完了在跑,但是又不搞死主线程
展开
2个回答
展开全部
// 1. 用事件对象CEvent,这个CEvent对象声明为对话框的成员函数,比如
// CEvent m_eventFileSendFinished;
// 2. 然后将这个事件对象初始化为手动,无信号状态。通过线程参数传递给文件发送线程,在子线程中,当传输完毕后,设置m_eventFileSendFinished这个事件为有信号状态。
// 3. 最后,在主线程循环里检测这个事件的信号状态。这样主线程就不会假死了,还能干别的事情。
仔细想了下,用CEvent,主线程在调用WaitForSingleObject()等待CEvent对象触发的过程中还是会睡眠,这样界面就会假死。为了能让主线程不这样,只能通过自定义消息的方式来进行检测。
// 在对话框头文件中中自定义一个消息和声明一个消息处理函数
#define WM_SEND_FILE_COMPLETE WM_USER + 100
afx_msg void OnSendFileComplete(WPARAM wParam,LPARAM lParam);
// 在对话框实现文件中关联自定义消息和消息处理函数
ON_MESSAGE(WM_SEND_FILE_COMPLETE, OnSendFileComplete)
afx_msg void CXXDlg::OnSendFileComplete(WPARAM wParam, LPARAM lParam)
{
MSG msg;
while(TRUE)
{
if(PeekMessage(&msg,NULL,0,0)) // 子线程通过PostMessage发送消息给界面线程
{
}else{
// 可以显示进度,或干点别的
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询