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,让添加文本的线程都添加到先前写完了的列表,写线程转去写另外一个列表
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)