java与MFC中的一些常识
一个.java文件中可以有很多类。不过注意以下几点:
1.public 权限的类只能有一个(也可以一个都没有,但最多只有1个)
2.这个.java文件的文件名必须是public类的类名(一般的情况下,这里放置main方法是程序的入口。)
3.若这个文件中没有public的类,则文件名随便是一个类的名字即可
4.你用Javac 编译这个.java文件的时候,它会给每一个类生成一个.class文件
使用MFC的应用程序,如果某个按钮的处理函数一直在执行循环做某一个任务,那还能响应其它的消息吗?
就比如说某一个消息对应的处理函数一直在执行WHILE循环,然后我希望关闭程序或按其它按钮执行其它功能那产生的消息还能被应用程序响应吗?
据说是由APP下的RUN()函数维持消息循环的,如果处理函数不结束函数不就没法返回了吗,那是不是就没法回到RUN()进行消息循环来响应其它消息了? 假如能响应其它消息又是如何实现的?
如果的确是在执行while循环的话,确实不能再被响应了。函数不结束也的确无法返回。
要响应其他消息的话也做不到。
但是很多情况下如果有需要大量处理的数据要使用WHILE循环的话,完全可以另开一个线程去处理。没有必要堵塞主线程。 而且很多WHILE是可以被避免的,具体还是要看你实际应用。
- 追问
-
我是要做一个监控和控制电机的软件,要不停的读传感器数据计算后立刻输出控制信号,这么做可能只能用WHILE吧。。另开一线程麻烦吗,我不太懂这个,我翻了基本书也没找着啊,有没有简单快速介绍这个怎么用的书? 是不是用一个什么afxbeginthread命令什么的。。?
- 回答 是啊。这种情况下没有办法,只能另开线程。用AfxBeginThread或者CreateThread
但是按照目前的设计思路而言,这样的WHILE循环处理消息应该单独开一个线程进行监听。这样不会影响主线程和其他线程。监听线程接受到了消息后,MFC应该是使用函数指针来进行回调,这个有些记不住了,拿不准。
把画图窗口的指针利用这个参数LPVOID PARAM传给线程。
CWnd *pWnd = (CWnd *)PARAM;
CDC *pDC = pWnd->GetWindowDC();
1、使用全局变量,CDC *g_pDC = NULL;
在OnDraw中为其赋值。
在线程中判断g_pDC不为空,则执行函数体。
2、将pDC作为PARAM传进去。
3、使用全局变量theApp来获取所需的CDC。
这个做法不好,GDI并不是线程安全的,正确的做法是你不断更新内存中的一张位图,然后在正常的OnPaint里面,把内存中的位图复制到DC中。复制的时候你还要注意保证复制的同时,你的线程没有正好在更新这张位图。
位图的句柄等可以通过线程函数的参数(你这里是PARAM)来传递。
CreateThread或者AfxBeginThread均有一个参数,可以直接传递到你的线程函数的PARAM中。