|
Thanks. I suppose I must have something set wrong somewhere.
"Thank you, thank you very much" Elvis.
|
|
|
|
|
This has probably been solved a hundred times, but I want to be able to write applications that will have a MDI interface but I want to be able to put MFC components sucha Combo Boxes in the view.
For example, If I have a script engine then I want to be able to open a script and have a run/skip/ignore control for each step in that sequence.
Anyone able to help ?
Thanks.
Keith Kenny
|
|
|
|
|
Anonymous wrote:
I want to be able to put MFC components sucha Combo Boxes in the view.
in the last step last of creating your project derive your view class from CFormview
Mazy
"So,so you think you can tell,
Heaven from Hell,
Blue skies from pain,...
How I wish,how I wish you were here." Wish You Were Here-Pink Floyd-1975
|
|
|
|
|
I have a class with all sorts of functions. in my main application i declare a new variable based on that class. Now i can call functions from that class. BUT when the class is initialised i need to create a sort of a fake Window to catch messages... For this i declared a private HWND variable and when the class initialises i use CreateDialog() to create a fake dialog, but i pass NULL to the MAKINTRESOURCE and all because it doesn't really need to create a dialog. After that, i'm supposed to translate and dispatch the messages with the following code:
while(GetMessage(&messages, NULL, 0, 0))
{
if(!IsDialogMessage(msghandler, &messages))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
}
(if msghandler is the fake HWND and messages is a previously declared MSG variable)
now my problem is this:
when i create a new variable from this class, it initialises and it creates the fake HWND but of course it gets stuck in the message loop so my main app doesn't continue running and after i initialise the class i should call other functions from the class but this becomes impossible since the code is still running the message loop.
What do i need to do make the message loop run in the background so i can call other functions from the class. Do i need to use threads or is there a simpler solution. This problem rather took me by surprise... any help is welcome.
Many thanks
Kuniva
--------------------------------------------
God gave man a penis and a brain but not enough blood to make both of 'em work at the same time.
|
|
|
|
|
Your thread can be either pumping messages or doing something else, but not both at a time. So you'd have to move the message loop to a different thread. But this architecture of yours struck me as being really weird. Why do you need a message loop for? Why do you need that fake window for? If you could explain the general architecture of your app then maybe we could give you more valuable advice as to how to lay things out in your code.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Well, i need the fake window because after the initialisation i call a function from the class that uses
WSAAsyncSelect(sd, msghandler, WM_SOCKET, FD_READ | FD_CLOSE | FD_CONNECT);
where sd is the socket and msghandler the window, so you see i need someplace to send the socket notification messages...
I could also get my main app's HWND but i do not want this because i want to keep it all in the class, i need handlers to the socket events in my class....
i hope this provides a better view to it all, if you want to know anything else just ask me and i will post a reply.
I really dont know how to handle this, maybe i should change the entire structure i ahve no idea...
Thanks
Kuniva
--------------------------------------------
God gave man a penis and a brain but not enough blood to make both of 'em work at the same time.
|
|
|
|
|
OK, now things are clearer... Well, in order to get a separate messga pump where to receive Winsock messages, you have to launch another thread and make this thread create the (let's call it so) Winsock window. I've done this kind of things in the past, so I'm in the position to give you some advice:
In order to have your Winsock window, it is not necessary to create it as a dialog: instead, it's better to register a new window class of your own (this is only done once in the app lifetime):
WNDCLASS wndclass=
{
0,
WinsockWindowProc,
0,
0,
::GetModuleHandle(NULL),
NULL,
NULL,
NULL,
NULL,
"MYWINSOCKWINDOWCLASSORWHAETEVERNAME"
};
::RegisterClass(&wndclass);
Its associated winproc needs only the minimum code to handle Winsock notifications:
LRESULT WinsockWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_ASYNCSELECT:
...
return 1;
break;
default:
return ::DefWindowProc(hwnd,uMsg,wParam,lParam);
break;
}
} Now your mesagge pumping thread would go like this:
HWND hwndWinsock=NULL;
DWORD WINAPI WinsockThread(LPVOID)
{
hwndWinsock=::CreateWindow(
"MYWINSOCKWINDOWCLASSORWHAETEVERNAME","",0,0,0,0,0,
NULL,NULL,::GetModuleHandle(NULL),NULL);
MSG msg;
while(GetMessage(&msg,NULL,0,0)!=0){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
::DestroyWindow(hwndWinsock);
return 0;
} Launch WinsockThread on initialization time and you're done. To finish the thread use ::PostThreadMessage(idWinsockThread,WM_QUIT,0,0) .
I think this brief scheme can help you get started. Good luck.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
um.. how do i create the thread? i'm not very familiar with threads...
Kuniva
--------------------------------------------
God gave man a penis and a brain but not enough blood to make both of 'em work at the same time.
|
|
|
|
|
See your documentation on CreateThread .
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
i looked on MSDN, but is it correct that CreateThread is an MFC function?? Because i've tried to keep my class MFC-free so far and it would be a shame to loose that feature. Also, the code u suggested before, is that without any MFC too? if it isn't.. i'll look up the equivalents of them but do you know how to create a thread without MFC? or do you know what i should look for?
Thanks a lot for helping me, i appreciate it
Kuniva
--------------------------------------------
God gave man a penis and a brain but not enough blood to make both of 'em work at the same time.
|
|
|
|
|
There is an MFC CreateThread function as well as a pure Win32 version. Look for it further down the list in MSDN.
The snippets of code I posted before are all pure Win32, no MFC.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
ok, i have everything in place, i have but one more question:
i get the error:
'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'
this has to do with the fact that i made WinsockThread a member function of my class, when i make it global i know it will probably work but i'd like to keep it stuffed in my class, do you know any way to do this?
Kuniva
--------------------------------------------
God gave man a penis and a brain but not enough blood to make both of 'em work at the same time.
|
|
|
|
|
Make the function static (seems you have already done so) and insert WINAPI just before the name of the function in its declaration.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
what about accessing the variables then? i mean, when i try to access a variable in a static function i get an error i cant do this...
so i made the variables global and it works, its just that when i run it i get some warnings with freaky symbols about the globals...
Kuniva
--------------------------------------------
God gave man a penis and a brain but not enough blood to make both of 'em work at the same time.
|
|
|
|
|
The thread function has an LPVOID parameter that you can use to pass the object variables belong in. I usually make the thead proc a simple stub to the "real" function that does the job:
static DWORD WINAPI CMyClass:ThreadProcStub(LPVOID arg)
{
CMyCLass * obj=static_cast<CMyCLass *>(arg);
obj->Thread();
return 0;
}
void CMyClass::Thread()
{
} got the idea?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
a million thanks for your help, i got it working
Kuniva
--------------------------------------------
God gave man a penis and a brain but not enough blood to make both of 'em work at the same time.
|
|
|
|
|
Glad to have been helpful. See you around.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
sorry i didn't look close enough, CreateThread is also win32
Kuniva
--------------------------------------------
God gave man a penis and a brain but not enough blood to make both of 'em work at the same time.
|
|
|
|
|
If you need to call WSAAsyncSelect, your window handle cannot be a fake!
WSAAsyncSelect won't send any event until something was detected. Since this
is Microsoft extension to socket library. You need to provide a correct
window handle or else you must do it yourself. For example, you could have
a thread sending this message (WM_SOCKET /w events) to your application.
Hope that help!
"Dirty hands lead to important discovery..." - Thomas Edisson
|
|
|
|
|
Your best bet is probably to create another thread that just runs, because the thread with your fake message loop will block on the call to GetMessage until a message is sent to that thread. This may prevent any code that you would want to be executed from happening.
Could you give a little more detail in why you want to have this message pump with out any windows. Is it to send messages across threads or something?
If I have more details I may be able to suggest a better solution.
|
|
|
|
|
... doesn't mean anything, but it made you look...
Hello!
I'd like a guru to take a look at this:
if I use a pragma pack on a STRUCT like this:
#pragma pack(1) // aligment of 1 byte(was 4)
struct CODE
{
unsigned char cType;
union
{
DWORD iValue;
FARPROC lpAdress;
unsigned char * lpString;
};
};
#pragma pack(4) // aligment of 4 bytes
I will save out the 3 bytes never used with data alignment of 4 bytes, but does this slow down handling the struct? ( or "Where's the catch?" or "Why isn't everything aligned 1 byte?")
Thank You !
Georg Haan (.NL)
|
|
|
|
|
Georg Haan wrote:
but does this slow down handling the struct? ( or "Where's the catch?" or "Why isn't everything aligned 1 byte?")
Yes, in a big way. I believe most current processor instructions expect 4, 8, 16 or 64 byte alignment. In a world where memory is cheap (or at least cheaper than speed), you should use the default alignment the compiler selects for the appropriate build target.
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Don't ask me why, but with my code, I'm somethimes searching for a CODE with ctype = 6 and iValue = 4, with bytealignment = 1 I can do a
while((*(short*) &Ops[p02++].cType)!=(short)((0x100*OPSEP)+4))
where Ops is a CODE array, p02 a counter and OPSEP =
#define OPSEP 6
Hmz, Maybe if I add another bogus short and char in front of the ctype...
Comments?
Thanks.
Georg Haan (.NL)
|
|
|
|
|
Relying on byte alignment is dangerous and makes for hard to maintain code.
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|