MFC 多线程进度对话框

MFC 多线程进度对话框,第1张

第一个问题,可以有两种方法:

1. 用全局变量来传递信息,在新线程中如果对话框被取消,给该全局变量赋一个值,在主线程传输文件过程中判断该变量的值,如果是取消了,则主线程取消文件传输。

2. 用自定义消息,在新线程中如果对话框被取消,就向主线程所在窗体发送消息,在主线程中创建一个处理该消息的函数实现相应的功能即可。

第二个问题,原因可能是这样的:在主线程中定义对话框dlg,在新线程中dlg.domodal,然后在主线程修改,但问题是要保证主线程和新线程严格按照设定的顺序来执行。在主线程中启动新线程之后,主线程仍然在执行,有可能新线程中dlg.domodal还没执行,主线程dlg.m_pro.setpos已经执行过了,所以会出问题,加入AfxMessageBox之后在d出窗口没有关闭之前主线程没有继续往下执行,这就使新线程有足够的时间执行dlg.domodal,所以能够执行成功。你可以在主线程建立对话框并启动新线程之后延时一段时间,再执行dlg.m_pro.setpos。

首先,这种方式是不推荐的,效率、安全和数据一致性都不好。如果是为了数据交互,那么建议使用共享内存,如果数据有保存意义并且数量较大,建议使用数据库。

单纯说这个问题,MFC的CFile支持共享打开方式,CFile::shareDenyWrite和CFile::shareDenyRead,使用共享打开方式,并不影响另一个进程或线程对文件的访问。

写文件很快的

不太极端追求高实时性,不需要开新线程去写,可能还因为创建新线程还花更多的开销

另外多线程执行顺序确实不是可预测的,开了一堆线程,不能保证先开的线程就一定执行在最前,所以数据写入顺序是错的,可以理解

你可以把要写的文本添加到类似List<CString>中,往末尾追加,再开线程,线程去看List<CString>中有几个元素,没有就结束线程,有就从头元素开始写入文本文件,写完一个,删除头元素,再判断是否有元素,有就继续写头个元素,写完删,。。。。。。

这样就能保证写入顺序了,当然取出元素/删除元素时,要Section.Lock / Unlock

我喜欢用两个List<CString>,写的时候,标记下,让添加文本的都添加到另一个列表中,写完后,修改标记,以示切换这两个List,让添加文本的线程都添加到先前写完了的列表,写线程转去写另外一个列表


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/11998281.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存