|
Hi,
I have 2 applications, A.exe and B.exe, that have the following
interaction.
A's job is to start and kill B. (LaunchProcess to start and sending
WM_QUIT to kill)
Now I need B to log that shut off, meaning I want A to notify B that it
is going to kill it and I need B to log that info before it receives
the WM_QUIT.
B is a no GUI app, it has a WinMain which does some configuration work
and then calls RunMessagePump, which is also part of my code and it
looks like this :
inline WPARAM RunMessagePump() {
// Run the usual Windows message loop.
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
WM_QUIT is sent using PostThreadMessage and as far as I understand I
can not use PostMessage since B does not have any windows.
So I did some web research for PostThreadMessage and it seems like if I
send such msg to a windowless app than DispatchMessage can not handle
that since it does not know what to do with the message and it is
advised to write a thread specific hook, meaning define a callback
function, call setwindowshandler to set the callback and do all my
logging in the callback func.
However, what I do not understand is why changing the RunMessagePump
wont work, its in my code and I can change it. I tried it out and I
never receive the WM_MYMESSAGE, only the WM_QUIT, at least GetMessage
does not return that. One more thing I am concerned about is that the
MSDN documentation says that for messages WM_USER and up I need to
write my own custom marshalling. What does that mean ? What do I need
to write besides the thread-specific hook ?
Also, this all seems really complicated and delicate - any other way I
can let B know that it is going to die soon and therefore it needs to
do some special logging ?
--
Thank you!
|
|
|
|
|
You could use a message-only window[^] in B, that way A could do a normal PostMEssage or SendMessage to that window to do the communication.
|
|
|
|
|
The second process could watch for a specific event to be set, then use MsgWaiForMultipleObjects instead of your GetMessage() as the blocking call.
|
|
|
|
|
VS2005 (NOT with SP1)/MFC
When I add the OnSysCommand message handler to my app (without adding anything to it), the system menu starts acting weird. The left mouse button no longer displays the menu, and the right mouse button positions it incorrectly. On top of that, I can't resize the main window by click/dragging the border, and I can't move the window.
If I remove the OnSysCommand handler, the app behaves normally.
Has anyone ever seen that? Remember, I'm using the un-patched VS2005 with MFC.
I don't recall that happening in VC6.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
John Simmons / outlaw programmer wrote: When I add the OnSysCommand message handler to my app (without adding anything to it),...
Are you calling the base class OnSysCommand()?
Mark
|
|
|
|
|
Yes. It's a naked function, exactly the way the IDE gave it to me when I added the handler.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
any chance to see a piece of code John ?
|
|
|
|
|
If you have an app handy, add a handler for OnSysCommand, and that's what I have.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
Sounds like your handler is eating SC_MOVE and other SC_* commands that are generated when you use the window-management commands.
|
|
|
|
|
All SC_* commands are being passed on to the base handler.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
Check this out - I posted it today:
http://www.codeproject.com/menu/System_Menu.asp[^]
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
I'm trying to create a program that will, in a 30-team league, assign each team to play 6 times each against 17 teams, and 5 times each against 12 teams.
Before you read my code, you should be warned that I'm a bad coder, so if you could tell me how to organize my code better, thanks.
But my problem is that when I change this line: while(teamOpponents[a][randomMonth][randomDay] != 100 || teamOpponents[b][randomMonth][randomDay] != 100); to this line: while(teamOpponents[a][randomMonth][randomDay] != 100 || teamOpponents[b][randomMonth][randomDay] != 100 || (randomMonth == 3 && randomDay == 9)); , the compiled program will halt (compile it yourself, and you'll see) (possibly in some kind of infinite loop(?)
My bad code:
http://www.codeguru.com/forum/showthread.php?p=1522813#post1522813
|
|
|
|
|
Looks like an infinite loop to me.
Mark
|
|
|
|
|
Where? (after I put in the extra code)
|
|
|
|
|
What changes to cause this loop to stop?
while(randomMonth == 200 || randomDay == 200 ||
teamOpponents[a][randomMonth][randomDay] != 100 ||
teamOpponents[b][randomMonth][randomDay] != 100)
{
randomMonth = rand()%6;
randomDay = rand()%31;
}
|
|
|
|
|
Look at all the code...also, try compiling my WHOLE script (from the link I provided).
I have an array teamOpponents[30][6][31]...meaning 30 teams, 6 months, and 31 days in each month (I'm trying to make the program not write to the 31st days of April, June, and September.)
All the values of teamOpponents[][][] have been set to 100. 100 means that the value has not been changed yet.
If the slot in the array has been changed (so the slot != 100), generate a new random month and day...
|
|
|
|
|
From what link?
I assumed the array elements were initially assigned to 100 based on the while statement's
expression.
Did I miss where you perhaps moved that closing curley bracket down (past where something in
the arrays actually gets changed?
Mark
|
|
|
|
|
|
Here's what I got from the link. This code will get stuck in the while loop.
What have you changed to make this work?
for(int c = 0; c < amountofGames[a][b]; c++)
{
randomMonth = 200;
randomDay = 200;
while(randomMonth == 200 || randomDay == 200 ||
teamOpponents[a][randomMonth][randomDay] != 100 ||
teamOpponents[b][randomMonth][randomDay] != 100)
{
randomMonth = rand()%6;
randomDay = rand()%31;
}
teamOpponents[a][randomMonth][randomDay] = b;
teamOpponents[b][randomMonth][randomDay] = a;
random = rand()%2;
if (random == 0)
{
home[a][randomMonth][randomDay] = 1;
home[b][randomMonth][randomDay] = 0;
}else
{
home[a][randomMonth][randomDay] = 0;
home[b][randomMonth][randomDay] = 1;
}
}
|
|
|
|
|
No, this code doesn't get stuck at all...it won't get stuck until I change
while(randomMonth == 200 || randomDay == 200 ||
teamOpponents[a][randomMonth][randomDay] != 100 ||
teamOpponents[b][randomMonth][randomDay] != 100)
to
while(randomMonth == 200 || randomDay == 200 ||
teamOpponents[a][randomMonth][randomDay] != 100 ||
teamOpponents[b][randomMonth][randomDay] != 100 ||
(randomMonth == 3 && randomMonth == 9))
I assigned the value 100 to all the parts of the array.
So, if the array value isn't 100 (which means that it HAS been altered), keep generating a randomMonth and randomDay until the value of a DIFFERENT teamOpponents[a][randomMonth][randomDay] is 100 (meaning it hasn't been altered.)
Sorry if this is confusing, but if you have time to read the entire script, you might understand.
Thanks for your help though, any other ideas about why adding one conditional will cause it to halt?
|
|
|
|
|
Ok let me get my head out of my... disregard the previous infinite loop stuff.
This is what I got from the link, right?
for(int c = 0; c < amountofGames[a][b]; c++)
{
randomMonth = 200;
randomDay = 200;
if(randomMonth == 3 && randomDay == 9)
randomMonth = rand()%6;
randomDay = rand()%31;
while(randomMonth == 200 || randomDay == 200 ||
teamOpponents[a][randomMonth][randomDay] != 100 ||
teamOpponents[b][randomMonth][randomDay] != 100)
{
randomMonth = rand()%6;
randomDay = rand()%31;
}
if(randomMonth == 3 && randomDay == 9)
randomMonth = rand()%6;
randomDay = rand()%31;
teamOpponents[a][randomMonth][randomDay] = b;
teamOpponents[b][randomMonth][randomDay] = a;
random = rand()%2;
if (random == 0)
{
home[a][randomMonth][randomDay] = 1;
home[b][randomMonth][randomDay] = 0;
}else
{
home[a][randomMonth][randomDay] = 0;
home[b][randomMonth][randomDay] = 1;
}
}
|
|
|
|
|
Yes, but the code between the two // works (doesn't halt) and the two // fails (halts) don't check again to see if the value in the teamOpponents array is 100...
I want the script to be this, but this doesn't work unless I take out the ||(randomMonth == 3 & randomDay == 9) part:
for(int c = 0; c < amountofGames[a][b]; c++)<br />
{<br />
do<br />
{<br />
randomMonth = rand()%6;<br />
randomDay = rand()%31;<br />
}<br />
while(teamOpponents[a][randomMonth][randomDay] != 100 ||<br />
teamOpponents[b][randomMonth][randomDay] != 100 ||<br />
(randomMonth == 3 & randomDay == 9))<br />
<br />
<br />
teamOpponents[a][randomMonth][randomDay] = b;<br />
teamOpponents[b][randomMonth][randomDay] = a;<br />
<br />
random = rand()%2;<br />
<br />
if (random == 0)<br />
{<br />
home[a][randomMonth][randomDay] = 1;<br />
home[b][randomMonth][randomDay] = 0;<br />
}else<br />
{<br />
home[a][randomMonth][randomDay] = 0;<br />
home[b][randomMonth][randomDay] = 1; <br />
}<br />
<br />
}
-- modified at 17:48 Thursday 25th January, 2007
|
|
|
|
|
Try changing
while(teamOpponents[a][randomMonth][randomDay] != 100 ||
teamOpponents[b][randomMonth][randomDay] != 100 ||
(randomMonth == 3 & randomDay == 9))
to
while(teamOpponents[a][randomMonth][randomDay] != 100 ||
teamOpponents[b][randomMonth][randomDay] != 100 ||
(randomMonth == 3 && randomDay == 9))
|
|
|
|
|
Sorry, I meant &&, but neither & nor && works...
...could you try compiling it yourself to see how it works? Maybe that way you could help me better...
...thanks for all your effort though
|
|
|
|
|
I don't have the initialization code.
It will take longer and longer to find uninitialized spots in the arrays.
Are you sure it's not just grinding away waiting to hit the right random numbers?
Mark
|
|
|
|