MFC一段文件操作代码在主线程和多线程中有什么区别和注意事项 10
代码功能:首先创建一个全局静态数组a[320][240][024],比较大。首先将一个bin文件读入,在改写成CSV文件。全部操作只是,打开文件,读入缓存,写入文件,完成...
代码功能:首先创建一个全局静态数组a[320][240][024],比较大。首先将一个bin文件读入,在改写成CSV文件。全部操作只是,打开文件,读入缓存,写入文件,完成。该功能在控制台项目中,一个main函数中实现,如果转换多次,多次循环,可正常运行。如图所示。出现的问题:我想做一个MFC的界面方面使用。将改代码放入一个按钮中,如果循环次数过多,界面将卡死。那么我在按钮中启动一个工作者线程,将改代码放入线程中,点击按钮启动线程。多次循环放入线程中,但是转换结果使得数据位置错乱,是什么原因?如图所示。如果改成CFile,或者其他,在MFC中有什么方法,可以方便的读写CSV文件?bin文件是个浮点数的表,如何把二进制bin文件变成CSV文件?
展开
1个回答
展开全部
首先强调一点:你这里有主线程和和新建线程,它们都存在于你这个程序的进程里,这个问题没涉及主进程、子进程什么的,进程和线程的概念千万别弄混。
即使新建线程没用Sleep函数,界面照样不能即时响应新建线程更新界面的操作。Windows的线程可分为UI线程和工作线程,主线程是UI线程,负责一切响应用户输入和绘制窗口界面的人机交互工作,新建的线程是工作线程,只负责运算,不处理人机交互。所以何时响应界面的更新绘制是由你的主线程决定的,如果主线程还在执行某个函数而没有回到消息循环,就不能更新界面,啥时候那个函数执行完了就可以更新界面了。
防止线程被打断,是线程同步问题,与这里的问题没啥关系。Windows提供了一系列的线程同步API,你可以使用像自旋锁、临界区、Slim读写锁、条件变量这样的用户级线程同步API,也可以使用事件、信号量、互斥量这样的内核同步对象。具体的原理和使用方法不是三言两语能说清楚的,你可以阅读操作系统教材和《Windows核心编程》中讲解多线程的章节。
即使新建线程没用Sleep函数,界面照样不能即时响应新建线程更新界面的操作。Windows的线程可分为UI线程和工作线程,主线程是UI线程,负责一切响应用户输入和绘制窗口界面的人机交互工作,新建的线程是工作线程,只负责运算,不处理人机交互。所以何时响应界面的更新绘制是由你的主线程决定的,如果主线程还在执行某个函数而没有回到消息循环,就不能更新界面,啥时候那个函数执行完了就可以更新界面了。
防止线程被打断,是线程同步问题,与这里的问题没啥关系。Windows提供了一系列的线程同步API,你可以使用像自旋锁、临界区、Slim读写锁、条件变量这样的用户级线程同步API,也可以使用事件、信号量、互斥量这样的内核同步对象。具体的原理和使用方法不是三言两语能说清楚的,你可以阅读操作系统教材和《Windows核心编程》中讲解多线程的章节。
追问
您说的问题,我都明白,感谢您的悉心指导。我的目的很简单,就是希望按钮按下后,开始一个子线程,该线程只做运算,运算状态通过::sendmessage通知主UI线程,主线程来刷新界面显示。但是目前出现的问题是,为什么我这段文件操作代码在控制台的Main函数中运行正常,而放在worker线程中就出现了错乱?有没有什么注意事项?谢谢
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询