MFC线程传输文件问题,

我要通过一个按钮按下之后就送文件,但是因为文件比较大,如果在按钮函数下直接传送因为while比较多,所以会导致MFC假死,所以想开一个线程传送,可是问题来了,主线程和se... 我要通过一个按钮按下之后就送文件,但是因为文件比较大,如果在按钮函数下直接传送因为while比较多,所以会导致MFC假死,所以想开一个线程传送,可是问题来了,主线程和send(就是我按下按钮之后创建的线程)因为不停的切换,导致速度很慢,有什么办法让主线程一直到send线程送完了在跑,但是又不搞死主线程 展开
 我来答
shb8845369
推荐于2016-04-11 · TA获得超过280个赞
知道小有建树答主
回答量:138
采纳率:0%
帮助的人:167万
展开全部
// 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{
            // 可以显示进度,或干点别的
        }
    }
}
国松唯菜9e
2014-05-21 · 超过26用户采纳过TA的回答
知道答主
回答量:255
采纳率:0%
帮助的人:82.7万
展开全部
让主线程等待子线程运行完再执行有这个函数,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式