|
Hi
I'm new to multi-threading.
I have 2 classes CClass1 and CClass2.
CClass2 creates a new thread. CClass1 needs to trigger a function in this new thread. So I'm thinking of doing
void CClass1::MyCode1()<br />
{<br />
PostThreadMessage(Class2ThreadID, MY_MESSAGE, wParam, lParam);<br />
}
and catch this in CClass2 using
BEGIN_MSG_MAP(CClass2)<br />
MESSAGE_HANDLER(MY_MESSAGE, MyCode2)<br />
END_MSG_MAP()
But how do I make sure MyCode2 runs in this thread that I will create in CClass2 as it gets instantiated?
void CClass2::InitThread()<br />
{<br />
HANDLE myThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) MyCode2, NULL, 0, &Class2ThreadID);<br />
}
Also, I don't want MyCode2 to run until the message is received, but with this, it looks like CreateThread is going to want to run MyCode2 as soon as it creates the thread.
I'm confused.
Please help!
|
|
|
|
|
PaulowniaK wrote: But how do I make sure MyCode2 runs in this thread that I will create in CClass2 as it gets instantiated?
Do you mean you want to ensure that the thread has started ?
If so, you could use GetExitCodeThread[^] on the handle to check if the exit code is STILL_ACTIVE .
Or you could have the CClass2 constructor wait on a manual reset event after creating the thread.
The thread can set the event when it starts running.
PaulowniaK wrote: Also, I don't want MyCode2 to run until the message is received
You don't want to run the thread until the message is received, but the message can be sent only when the thread is running. Is there a chicken and egg problem here?
Well, you could again use events here.
Create an event using CreateEvent[^] and pass the event handle to the thread.
The thread will wait for the event to be signaled as soon as it is started.
The rest of the stuff in the thread will execute only after the event has been signaled from your main class.
«_Superman_»
I love work. It gives me something to do between weekends.
|
|
|
|
|
<quote>Do you mean you want to ensure that the thread has started ?
Not quite. I was wondering how to "attach" MyCode2 to the new thread. If I just wrote a code for MyCode2 and just called it, it would run in the default thread and the not the one I created anew, right?
I've done:
<br />
void CClass2::InitThread()<br />
{<br />
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) MyRoutine, NULL, 0, &hThread); <br />
}<br />
<br />
void CClass2::MyRoutine()<br />
{<br />
MSG msg;<br />
for(;;)<br />
{<br />
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))<br />
{<br />
DoWork();<br />
}<br />
}<br />
}<br />
While CClass1 does PostThreadMessage.
It seems to work, but it is a scary thought that MyRoutine is running continuously looking for messages...
Maybe I need to read up about Events... hmmm...
Thanks for the help.
|
|
|
|
|
PaulowniaK wrote: Not quite. I was wondering how to "attach" MyCode2 to the new thread. If I just wrote a code for MyCode2 and just called it, it would run in the default thread and the not the one I created anew, right?
I've done:
void CClass2::InitThread()
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) MyRoutine, NULL, 0, &hThread);
}
In the above code snippet MyRoutine will be started in a new thread. That is what CreateThread does for you.
PaulowniaK wrote: It seems to work, but it is a scary thought that MyRoutine is running continuously looking for messages...
Use GetMessage instead of PeekMessage so that it does not loop continuously.
«_Superman_»
I love work. It gives me something to do between weekends.
|
|
|
|
|
Thanks for the advice. I needed to loop using PeekMessage so that messages were received at any time for the duration of the thread (entire lifetime of the application).
I've had to add additional functionalities which meant I really had to think seriously about using events instead. I want to use CEvent but to do that I need afxmt.h.
If I include afxmt.h in my stdafx.h after atlbase.h I get an error about MFC applications not being allowed to have windows.h.
If I put the afxmt.h before atlbase.h I get a linker error about _DLLMain@12 already being defined. It looks like the problem is in atlbase.h so I have a chicken and egg situation.
I've looked at changing the order of linking libraries, but with not much success as the error says _DLLMain is defined already in MyObject.obj (i.e. obj file created from my application I am writing at the moment).
Please help!
|
|
|
|
|
Hello folks!
I am trying to build a filter graph which includes a sample grabber filter. I add the sample grabber filter (and configure it to take video input) and the null renderer filter to the graph, then i add a source filter using IGraphBuilder::AddSourceFilter[^] for a certain video file. After this i query the source filter for its output pin and the sample grabber for its input pin and once i got these, i tell the grapbh builder to connect them. At this point my program quits. There is no error code returned, no exception thrown, nothing usefull in the debug output window, no nothing, the process simply stops without a word (at least nothing i can see). I checked around the net and looked at a few examples and basicly this aproach seems to be ok, others build the sample-grabber graphs the same way. Then i tried to recreate these steps using GraphEdit, i added the source filter for the same file, i added the sample grabber filter and tried to connect the two and the result was the very same (as much as one can tell by looking at it), GraphEdit quits without saying anything. Since graphedit behaves exactly like this too i guess the error doesn't seem to be in my code but then where? Does anyone have any idea what might cause this or where i should check to see the problem? Am using VS2003 and VC++.
Thanks for any help in advance...
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Life: great graphics, but the gameplay sux. <
|
|
|
|
|
what's the format of your video file. does the programme quite whatever source files connect?
it's my pleasure to make friend with you.
|
|
|
|
|
It is a DivX avi, after i read your reply i also tried with an mpg file (in graphedit), with mpg graphedit crashed, i tried with another DivX avi, with that it could connect the pins (also in graph edit), i have yet to try this with my own program to see how that behaves, however i don't see the pattern yet.
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Life: great graphics, but the gameplay sux. <
|
|
|
|
|
I had written a case which rendered a wmv file and grab picture in the grabber filter years ago. It work well. If you need the source codes, please contact to me. I will send you.
my MSN: zhu_lin4103@126.com
it's my pleasure to make friend with you.
|
|
|
|
|
//This gives me HWND to the external app
HWND hWnd = ::FindWindow(NULL, "TEST");
From hWnd, how do i get the HWND for a picture control in that application?
From Spy I get "Window 000406F2 "" Static"
It has a control id of 000003E8
Can someone please help?
Thanks a million.
modified on Sunday, August 23, 2009 9:36 AM
|
|
|
|
|
EnumChildWindows()
You may be right
I may be crazy
-- Billy Joel --
Within you lies the power for good - Use it!
|
|
|
|
|
|
I have a multi-thread MFC application.
I used Ado2 moudule by "Carlos Antollini" to act with my database.
When I monitor my application by windows TaskManger, I see that "Mem Usage" & "VM Size" of my application is increasing without freeing memory until I close the application.
I read most of memory management documents and I could not solve my application problem.
Also I test some useful tools like "Trial DeLeaker" to detect problem. But all of memory leak tools report no memory leak! Specialty "DeLeaker" says "no GDI leak", "no Mem Leaks", "no Handle leaks".
Please give me tips to find my problem.
Can I find my problem by Rational Purify? I have not it.
Thanks.
|
|
|
|
|
what happens if you minimize you program's window ?
|
|
|
|
|
When I minimize my application, it frees some of "Mem Usage". But still it keeps used "VM Size".
Also it keeps memory consuming when I restore it or it remains minimized.
I still wait for a solution.
Thanks.
|
|
|
|
|
is the database server on your cp ? mybe the database.
and what did your programme do when the memory increased.
it's my pleasure to make friend with you.
|
|
|
|
|
I used a simple access file (.mdb) in local computer.
My application became slow after memory consumption!
|
|
|
|
|
I've used Dan Moulding's Visual Leak Detector[^] when tracking down memory leaks.
But I really recommend you to read this article[^] as chances are that you don't have a memory leak at all.
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
I found my problem using Easy Detection of Memory Leaks[^].
BOOL CSmartToolTip::SetTipText(CWnd *pTipOwnerWnd, CString strTip )
{
TOOLINFO ti;
_CreateTipWnd();
ti.cbSize = sizeof(ti);
ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
ti.hwnd = pTipOwnerWnd->GetParent()->GetSafeHwnd();
ti.uId = (UINT)pTipOwnerWnd->GetSafeHwnd();
ti.hinst = AfxGetResourceHandle();
ti.lpszText = (LPTSTR)((LPCTSTR)strTip);
return((BOOL)SendMessage(TTM_ADDTOOL, 0, (LPARAM)&ti));
}
void CSmartToolTip::_CreateTipWnd()
{
if( ! IsWindow(*this) )
{
this->Create( NULL );
SetTipBkColor( RGB( 255, 255, 0) );
SetTipTextColor( RGB( 0, 0, 0) );
::SendMessage( *this, TTM_SETMAXTIPWIDTH, 0,
(LPARAM)(INT) MAKELONG(400, 0));
}
}
The problem located in above code. I periodically call above function in my application.
But why leak? Can any one help me please?
|
|
|
|
|
hello everyone
i want to load a bitmap from file and insert in specific coordinate of my SDI program.
but when i write codes and run program it shows nothing.
could i have a guide to using and inserting bitmap in my SDI.
thanx
|
|
|
|
|
could you show your code?
Of one Essence is the human race
thus has Creation put the base
One Limb impacted is sufficient
For all Others to feel the Mace
(Saadi )
|
|
|
|
|
CBitmap Bitmap;
CDC dcMem;
HBITMAP hBitmap = 0;
hBitmap = (HBITMAP)LoadImage( AfxGetInstanceHandle(),
strLocationOfBitmap,
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE | LR_DEFAULTSIZE);
dcMem.CreateCompatibleDC(pDC);
Bitmap.CreateCompatibleBitmap(pDC, 390, -230);
Bitmap.Attach( hBitmap );
dcMem.SelectObject(&Bitmap);
pDC->BitBlt(1280, -1765, 390, -230, &dcMem, 0, 0, SRCCOPY);
i used many codes delete and add some function to them.
i never used GUI in VC++.
|
|
|
|
|
And where is this code?
1/
It would make sense to only load the CBitmap once - in your constructor maybe?
2/ -1765 seems very high... Does it work with (0,0) ?
Iain.
I have now moved to Sweden for love (awwww).
If you're in Scandinavia and want an MVP on the payroll (or happy with a remote worker), or need cotract work done, give me a job! http://cv.imcsoft.co.uk/[ ^]
|
|
|
|
|
1. in a function within c..view class
2. no it doesn't work even at (0, 0)
|
|
|
|
|
Which event you use this code?
Of one Essence is the human race
thus has Creation put the base
One Limb impacted is sufficient
For all Others to feel the Mace
(Saadi )
|
|
|
|
|