小弟初学mfc,到处碰壁。
尤其是函数的调用,以及各模块的责任,搞得我混乱。很想知道mfc为我们做了什么,就在那里瞎调试。
为了找到一个函数的说明,得在msdn上找半天。(还全是英文:))
新装了net版,感觉用起来好多了。下面是我的三个问题:1、
我本来是用向导创建一个edit控件。设置了它的风格。
现在想用create函数来创建,但是无论怎么设置ws风格,
几乎把所有的ws都用上了,就是不能和原来的一样。
我想知道如何能找到mfc向导为我们设置的风格参数。2、
窗口函数是由user模块调用的,那么他如何根据相应的消息来
让用户进程调用消息处理函数。
(不是由user模块来调用吧?)。
能否通过调试等方法找到答案。3、
消息循环和界面其他的处理开在一个线程里是否合适。
有两个问题:
(1)如果主界面线程阻塞,并且其他的线程是工作者线程,就死锁了。
(2)消息循环和其他处理之间如何合理的分配cpu时间。
如果再加几个定时的时钟,到底执行到谁了,岂不是很混乱。
有没有一种方法来跟踪到底执行到谁了。
有没有一种方法来保证一定的执行顺序。
初学mfc,所以有很多机制没有弄清楚。
可能问得也有点问题。请大家指出来。
谢谢各位。
尤其是函数的调用,以及各模块的责任,搞得我混乱。很想知道mfc为我们做了什么,就在那里瞎调试。
为了找到一个函数的说明,得在msdn上找半天。(还全是英文:))
新装了net版,感觉用起来好多了。下面是我的三个问题:1、
我本来是用向导创建一个edit控件。设置了它的风格。
现在想用create函数来创建,但是无论怎么设置ws风格,
几乎把所有的ws都用上了,就是不能和原来的一样。
我想知道如何能找到mfc向导为我们设置的风格参数。2、
窗口函数是由user模块调用的,那么他如何根据相应的消息来
让用户进程调用消息处理函数。
(不是由user模块来调用吧?)。
能否通过调试等方法找到答案。3、
消息循环和界面其他的处理开在一个线程里是否合适。
有两个问题:
(1)如果主界面线程阻塞,并且其他的线程是工作者线程,就死锁了。
(2)消息循环和其他处理之间如何合理的分配cpu时间。
如果再加几个定时的时钟,到底执行到谁了,岂不是很混乱。
有没有一种方法来跟踪到底执行到谁了。
有没有一种方法来保证一定的执行顺序。
初学mfc,所以有很多机制没有弄清楚。
可能问得也有点问题。请大家指出来。
谢谢各位。
2. 看深入浅出
3. 不知道,多线程看windows高级编程或win32多线程程序设计
2. 看深入浅出
3. 不知道,多线程看windows高级编程或win32多线程程序设计
第2个问题就是看深入浅出,看着看着突然混乱掉了。现在头晕。呵呵。
等我清醒一会儿再看看。
第三个问题应该是每个进程生成是都会自动的生成一个主线程用来处理事物,当主线程不一定能很好的控制程序的流向时,可以生成副线程来辅助(以免影响用户和计算机的交互)分配cpu的时间是由系统来完成,一般的情况下不需要太多的考虑,当线程间有交互时程序容易发生锁死的情况,才应当考虑先后的问题(情况比较复杂,应小心在程序中处理)
手头没有这本书。我找找看。
清华的书,要出血啊。呵呵。
大家不要说得那么简洁啊,说一两句看法或者解释先。谢谢。
user模块把消息发到应用的消息循环去(通过getmessage)
消息循环把消息分派到窗口函数。(通过dispatchmessage)问题是窗口函数是由user模块调用的。
但是有一些消息的处理函数是由我们来写的,这些函数是不是由用户进程来执行的呢?
如果不是,user模块怎么调用用户进程中的消息处理函数?
如果是,user模块怎么能让用户进程去调用消息处理函数?哎,头晕。
比如普通sdk窗口程序中大部分都有
while(GetMessage())
{
TranslateMessage();
DispatchMessage();
}
专门处理消息的过程
里有许多诱人的东西
窗口函数并不是由user模块调用,它只是负责把硬件消息放到系统消息队列中。
系统消息队列中的消息和post到应用程序消息队列的消息由消息循环处理,在处理中
DispatchMessage调用对应的窗口函数。如果是SendMessage的话调用方程序将直接调用
窗口函数。
“user32.dll模块被进程加载在自己的进程空间之中”。
原来如此!我本来以为user模块是一个独立的线程来着。:)
谢谢你,现在头脑不晕了。
比如鼠标点击,产生一个中断,是user模块把中断封装成消息。
窗口函数是call back的,是user模块调用它吧。
好象是dispatchmessage先调用user模块,再user模块调用wndproc。 听你一说,我又要晕。
:)。
>>比如鼠标点击,产生一个中断,是user模块把中断封装成消息。
我的意思也是这样
>>窗口函数是call back的,是user模块调用它吧。
>>好象是dispatchmessage先调用user模块,再user模块调用wndproc。
DispatchMessage是user32.dll的导出函数,所以是dispatchmessage借助这个
函数来调用正确的窗口过程
>>比如鼠标点击,产生一个中断,是user模块把中断封装成消息。
我的意思也是这样
>>窗口函数是call back的,是user模块调用它吧。
>>好象是dispatchmessage先调用user模块,再user模块调用wndproc。
DispatchMessage是user32.dll的导出函数,只是借助dispatchmessage这个
函数来调用正确的窗口过程,它与MessageBox或其它api函数本质上没两样,
所以真正处理消息队列消息及调用窗口函数还是靠应用程序自己,如果不dispatch消息,
即使有消息也不会导致窗口过程被调用。
bcpl说的“DispatchMessage是user32.dll的导出函数”
这个不大懂,我再去查查资料。这样看来,第3个问题是不是问得多余了?
反正就一个消息一个消息处理贝,呵呵。vc版有点热闹了。这样才好哇。