|
Nah, it's not wrong, it's exactly what Sleep() does. It has no knowledge of the context of what the application is doing (message dispatch or whatever else), it just stops running for the specified amount of time.
|
|
|
|
|
In addition to the other replies....
There's rarely a need to sit in a loop on the UI/message-loop thread. Waiting on I/O should be done on separate thread(s). IMO, learn how to use threads and thread synchronization objects like events and your app will be much better behaved (not eating CPU cycles doing nothing). Even a PeekMessage loop is going to peg a virtual processor unnecessarily. At least use GetMessage() if you can
Mark Salsbery
|
|
|
|
|
Yes, PeekMessage() is CPU intensive but GetMessage() blocks. PeekMessage() allows your GUI to be "responsive" incase the user clicks on something, GetMessage() waits UNTIL the user clicks on something. (Yes, I know "Clicks or types or something")
|
|
|
|
|
Chuck O'Toole wrote: PeekMessage() allows your GUI to be "responsive" incase the user clicks on something
All messages go through either function (unless filtered). If not there would be a ton of unresponsive apps that use getMessage() in their message loop(s)
Mark Salsbery
|
|
|
|
|
You miss my point. If you have a loop like the OP that is doing something like polling for I/O then he's not getting back to the Windows message pump so his GUI is "unresponsive" (and his Timer requests aren't being handled - WM_TIMER). His problem is to *make* the GUI responsive while processing whatever he's doing. A "PeekMessage()" loop, strategically placed in his processing loop, will allow the Windows Messages to be processed. A "GetMessage()" loop, while it would make his GUI responsive, would totally hang *his* processing loop. So he needs a solution that keeps his loop running while allowing Windows to processes pending messages, hence "PeekMessage()".
Yes, threads might serve him better but at the cost of redesigning his app. A PeekMessage() loop is a quickie solution to this particular problem.
|
|
|
|
|
Mark Salsbery wrote: Waiting on I/O should be done on separate thread(s)
I agree, UI and IO should be kept apart.
==============================
Nothing to say.
|
|
|
|
|
Thanks you all for the replies it was very usefull i learned alot!!!
|
|
|
|
|
A Universal TCP Socket Class for Non-blocking Server/Clients
Single Threaded
The function PumpMessages() processes all Windows messages which arrive in the application so the GUI stays responsive although the code runs an endless loop:
mi_Socket.Listen(0, ms32_Port, 50);
while (...)
{
PumpMessages();
DWORD u32_Event;
SOCKET h_Socket;
DWORD u32_Error = mi_Socket.ProcessEvents(&u32_Event, &h_Socket, ....);
if (u32_Error == ERROR_TIMEOUT)
continue;
if (u32_Event & FD_ACCEPT) { }
if (u32_Event & FD_READ) { }
if (u32_Event & FD_CLOSE) { }
if (u32_Error) { }
};
|
|
|
|
|
Hi all,
Is there any alternate of MCIWndCreate API.
I want to play video in my application, and for doing it i have used MCIWnd functions. But my application is crashing due to these functions.
i have written this line
<pre>
m_myPlayer = MCIWndCreate(m_WndPreview->m_hWnd,AfxGetInstanceHandle(),WS_CHILD | WS_VISIBLE |MCIWNDF_NOMENU,File_Path);</pre>
Can anybody help me in this???
|
|
|
|
|
Your question is a bit vague. Are you looking for an alternate way to play AVI files? Are you looking for an alternate way to create the same MCI window? Aside of this, if it makes your application crash you are probably doing something wrong.
Anyways, to play all kinds of media, i'd try DirectShow[^] rather than MCI. I hope this can help you.
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> If it doesn't matter, it's antimatter.<
|
|
|
|
|
Hi all,
I start to do a simple application to control the P2LTCH(to blink a LED). So the toggle function as follow,
void toggleLed(unsigned char ledMask)
{
asm
(
mov dx, P2LTCH
);
}
However, it returns the following error.
Error [318] D:\Profiles\PC\WorkOnProjects\PIC\Demo\led_blink.c; 41.1 string expected
Error [194] D:\Profiles\PC\WorkOnProjects\PIC\Demo\led_blink.c; 41.1 ")" expected
Error [312] D:\Profiles\PC\WorkOnProjects\PIC\Demo\led_blink.c; 41.1 ";" expected
I do the coding on MPLAB IDE. Any comments really appreciate.
I appreciate your help all the time...
CodingLover
modified 1-Nov-11 5:54am.
|
|
|
|
|
The inline assembler block starts with "{".
|
|
|
|
|
I already tried that. But it doesn't work for me.
I appreciate your help all the time...
CodingLover
|
|
|
|
|
See here[^], and yes you must use curly braces around your code block.
Unrequited desire is character building. OriginalGriff
I'm sitting here giving you a standing ovation - Len Goodman
|
|
|
|
|
Thanks for the comment.
I tried a same example code segment from that page.
void toggleLed(unsigned char ledMask)
{
__asm {
mov al, 2
mov dx, 0xD007
out dx, al
}
}
Once I compile the code it gives the following error. It wired to me from what the documentations explain (the link you gave, book I refer, etc..)
Error [192] D:\Profiles\PC\WorkOnProjects\PIC\Demo\led_blink.c; 39.1 undefined identifier "__asm"
Error [312] D:\Profiles\PC\WorkOnProjects\PIC\Demo\led_blink.c; 39.7 ";" expected
Error [285] D:\Profiles\PC\WorkOnProjects\PIC\Demo\led_blink.c; 44.1 no identifier in declaration
Warning [374] D:\Profiles\PC\WorkOnProjects\PIC\Demo\led_blink.c; 44.1 missing basic type; int assumed
Error [314] D:\Profiles\OC\WorkOnProjects\PIC\Demo\led_blink.c; 44.1 ";" expected
I appreciate your help all the time...
CodingLover
|
|
|
|
|
I just tried a search for P2LTCH with google, finding the following block of code here.
void
toggleLed(unsigned char ledMask)
{
#define P2LTCH 0xFF5E /* The address of the I/O register. */
asm {
mov dx, P2LTCH
in al, dx
mov ah, ledMask
xor al, ah
out dx, al
};
}
Reading through this, I thought of your asm statement - In the code you showed using round braces, you used the asm keyword. Later you showed some code with curly braces, however I see that in the seconds code snippet you have used the __asm keyword, instead.
If you haven't already, I'd try the syntax used in the above snippet. I've a very hazy memory that somewhere I read that the __asm keyword is a MS thing. Dunno, too lazy to check.
Though I do note that in Code::Blocks, asm gets syntax-highlighted, while __asm doesn't..
|
|
|
|
|
Actually that is the same I am referring, O'Reillys' book. But it doesn't work for me. Seems to me that my compiler is not support this.
I appreciate your help all the time...
CodingLover
|
|
|
|
|
Woooooah! Hold on just a minute. Did you say you're trying this code in mplab?
That code is obviously x86 inline assembly, yet I though MPLab was for embedded devices - i.e mainly PICs.
Looking at your compile log, it seems remarkably similar to the exerpt I just gotfor the HiTech C compiler, as shown below:
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.80\bin\picc.exe" --pass1 C:\Users\enhzflep\Documents\mplab\proj1\..\main.c -q --chip=16F84A -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Error [317] C:\Users\enhzflep\Documents\mplab\proj1\..\main.c; 5.5 "(" expected
Error [318] C:\Users\enhzflep\Documents\mplab\proj1\..\main.c; 5.5 string expected
Error [194] C:\Users\enhzflep\Documents\mplab\proj1\..\main.c; 5.5 ")" expected
Error [312] C:\Users\enhzflep\Documents\mplab\proj1\..\main.c; 5.5 ";" expected
Error [285] C:\Users\enhzflep\Documents\mplab\proj1\..\main.c; 15.1 no identifier in declaration
Warning [374] C:\Users\enhzflep\Documents\mplab\proj1\..\main.c; 15.1 missing basic type; int assumed
Error [314] C:\Users\enhzflep\Documents\mplab\proj1\..\main.c; 15.1 ";" expected
********** Build failed! **********
In that case, I think the problem is something else - i.e No, this compiler
(a) won't accept the asm keyword (but you can easily make functions in asm files then link them together into your program)
and more importantly (just now)
(b) won't build programs that you can run on your PC - I'd have expected to see the code snippet in concern built using VS or GCC.
Though, perhaps I'm just missing something?
|
|
|
|
|
enhzflep wrote: I've a very hazy memory that somewhere I read that the __asm keyword is a MS thing.
This is true (about the double underscore, not your memory).
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Show me a community that obeys the Ten Commandments and I'll show you a less crowded prison system." - Anonymous
|
|
|
|
|
Touchè!
|
|
|
|
|
I reread your original message and it seems you are using MPLAB to build this code. I suggest you check the documentation for your compiler to find out exactly why it complains about this. Are you sure this compiler supports the __asm or asm keywords? You may also be better using the MPLAB forum to get an answer to your question.
Unrequited desire is character building. OriginalGriff
I'm sitting here giving you a standing ovation - Len Goodman
|
|
|
|
|
Yeah, seems to me that the compiler I am using with the MPLAB is not supporting the syntax. I am searching on the documentation at the min.
I appreciate your help all the time...
CodingLover
|
|
|
|
|
You need to terminate the __asm block with a ';'
e.g.
__asm
{
mov eax,0
mov ebx,10
};
Also note that you MUST preserve (push/pop) any registers you use within an __asm block.
Another thing to note when using 'out' instruction - you may trigger an exception because the Windows OS allows only a few 'out' addresses accesses directly like that from user mode programs (ring 3).
If I remember correctly only tho old LPT ports are accessible.
|
|
|
|
|
I tried the same too, but no luck.
Snorri wrote: Another thing to note when using 'out' instruction - you may trigger an exception because the Windows OS allows only a few 'out' addresses accesses directly like that from user mode programs (ring 3).
I don't have a big picture about this in my mind, since I am new to embedded systems yet. However, that information could be a value added. Thanks a lot.
I appreciate your help all the time...
CodingLover
|
|
|
|
|
I found the solution my self by referring the MPLAB documentation. Inline assembly need to be wrapped as follows.
#asm
#endasm
I appreciate your help all the time...
CodingLover
|
|
|
|