|
Everything I've found to date on Thread classes are way too complex for what I want. I have a basic Thread class:
<br />
class Thread{<br />
public:<br />
Thread( ) ;<br />
virtual ~Thread( ) ;<br />
<br />
static DWORD WINAPI ThreadFunc( LPVOID lpParam ) ;<br />
<br />
void run( ) ;<br />
void end( ) ;<br />
void resume( ) ;<br />
void suspend( ) ;<br />
<br />
private:<br />
DWORD dwThreadId, dwThrdParam ;<br />
HANDLE hThread ;<br />
<br />
char szMsg[80];<br />
};<br />
What I need is something VERY simple that will allow me to easily extend what I already have to allow my Thread class to be inheritable such that two different classes that inherit it have their own specific critical section...
In Java, when I create a class, I can extend/inherit the Thread class. Let's say,
<br />
class Ant extends Thread{ ...<br />
The Ant class will have a 'run' method somewhere in there that will 'replace' (for want of a better term) the Thread class' own run method.
My C++ Thread class:
<br />
DWORD WINAPI Thread::ThreadFunc( LPVOID lpParam ){ <br />
return 0; <br />
}<br />
I have an Ant class. This class should provide an 'updated' ThreadFunc. I also have a World class. This class should provide a completely different 'updated' ThreadFunc.
Let's say I want:
<br />
Ant::ThreadFunc( stuff ){<br />
for( ; ; ){<br />
cout << "Hi" << endl ;<br />
}<br />
}<br />
and:
<br />
World::ThreadFunc( stuff ){<br />
for( ; ; ){<br />
cout << "Ih" << endl ;<br />
}<br />
}<br />
How can I manage this?
In case it helps, or gives you any ideas as to what I've done already, my Thread constructor is pretty much:
<br />
dwThrdParam = 1; <br />
<br />
hThread = CreateThread( <br />
0,
0,
ThreadFunc,
&dwThrdParam,
CREATE_SUSPENDED,
&dwThreadId
) ;<br />
<br />
cout << "Thread " << dwThreadId << " created." << endl ;<br />
<br />
if (hThread == NULL){<br />
wsprintf( szMsg, "CreateThread failed." ); <br />
MessageBox( NULL, szMsg, "main", MB_OK );<br />
}<br />
My project is to do a virtual ant colony, and I stupidly put down on the project spec that I'd have the ants running as seperate threads. Having other stuff running in its own thread could prove useful, but if I don't get the thread class goin properly, I'll just have to toss that part of the project. :/
Anyhoo - Javalike Thread class in C++.
Code would be great.
Or a good resource on how to do it would be cool also.
/* All those who believe in pshycokenesis, raise my hand.
*/
|
|
|
|
|
This is a very long post which is most likely the reason no one has replied. So what is the problem?
Quaoar wrote:
two different classes that inherit it have their own specific critical section
Is this what you want?
Just declare the critical section in the thread and pass a pointer to the object to the thread proc using the LPVOID lpParam paramater. Each object instance will have its own critical section.
John
|
|
|
|
|
A) you should be using _beginthreadex instead of CreateThread.
B) Make ThreadFunc() private
C) Add a public virtual function unsigned ThreadMain()
D) Passing the this pointer as the param. Inside the static thread function you call a virtual "Run" function through the this pointer: (i.e. ((Thread*)this)->ThreadMain();)
E) In the derived class, add a static data member for a critical section.
Make the critical section as small as possible. I question whether you'll actually need one except, perhaps, for collision detection or the like. Don't ignore the InterlockedExchange() and related calls.
Finally, using a thread for each ant is actually quite inefficient, but I'm sure you already know that. On the other hand, it will impress the easily impressionable.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Thanks guys. I'll try both solutions and see which works best for me.
Yes, I will have to look after collision detection - the ants will have to avoid obstacles placed down by the user.
It only struck me after submitting the project spec that threading each ant would be a kinda bad idea. I'll still try it, and include a note in the report if I decide to take the threads out.
As regards impressing the easily impressionable...
The lecturer who's supervising my project, supervised a different project in Java a year or two ago. When the student was presenting his project, he declared that it was portable. The lecturer was impressed, and asked for a demonstration in Linux. Of course, being in Java, the program worked just fine. The lecturer was highly impressed.
Thanks again for your help John, Joe.
/* All those who believe in pshycokenesis, raise my hand.
*/
|
|
|
|
|
How to Create a Button with Tooltip in "win32 application project"?
|
|
|
|
|
I'm using this :
http://www.codeproject.com/buttonctrl/cbuttonst.asp
but if you won't use more features of this class, (I use it for displaying icon buttons) it would give you too much overhead
rrrado
|
|
|
|
|
I'd like to store application's main dialog's size, position and maximize status.
I could do that by retrieving this info manually using IsZoomed(), to get size and position, and store this into registry.
But it's too much work to be done, and some problems for example when before application starts, last used monitor is removed, or resolution is lower ....
Does MFC or Windows API have complete solution for this ?
To serialize window's min/max status, size and position into registry and then back move window to last position and check if it will be visible to user and move it in case it wouldn't be ?
Thanks !
rrrado
|
|
|
|
|
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.x = AfxGetApp()->GetProfileInt("Settings", "WindowLeft", 0);
cs.y = AfxGetApp()->GetProfileInt("Settings", "WindowTop", 0);
cs.cx = AfxGetApp()->GetProfileInt("Settings", "WindowWidth", 640);
cs.cy = AfxGetApp()->GetProfileInt("Settings", "WindowHeight", 480);
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
BOOL CMainFrame::DestroyWindow()
{
CRect rc;
GetWindowRect(&rc);
AfxGetApp()->WriteProfileInt("Settings", "WindowLeft", rc.left);
AfxGetApp()->WriteProfileInt("Settings", "WindowTop", rc.top);
AfxGetApp()->WriteProfileInt("Settings", "WindowWidth", rc.Width());
AfxGetApp()->WriteProfileInt("Settings", "WindowHeight", rc.Height());
return CFrameWnd::DestroyWindow();
}
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
Not the best way.
This way has the problem in that say if the window was maximised, and u close down, when you restore your window it will fill the entire screeen as you would expect, but will have the maximise button rather than the restore button in the top corner.
The usual way of doing it is to use GetWindowPlaceMent to save and SetWindowPlaceMent to set (rather than GetClientRect) and store the
showCmd
flags
rcNormalPostion
Members of the retuned WINDOWPLACEMENT structure returned, and this will restore the window to the exact same state it was in when closed.
|
|
|
|
|
How to show Window Maximized? - initially.
thanks.
|
|
|
|
|
ShowWindow(SW_MAXIMIZE)?
Artificial intelligence is no match for natural
stupidity.
|
|
|
|
|
thanks ,
it works but for windows that was not provided
with windowPlacement struct,
with maximize size not filled with screen size.
How to do in that case.
Or how to set window no_move and no_resize?
|
|
|
|
|
You might want to see if SetWindowPos() does what you want.
Artificial intelligence is no match for natural
stupidity.
|
|
|
|
|
I want to customize a merged menu when in-place editing, but wm-initmenupopup msg can not be handled by CframeWnd handler(for example, the menu merged by office Word in my application), why?
is there any way to catch these msg or to customize the merged menu?
help, thanks.
|
|
|
|
|
I've two Dialogs (dialogA, dialogB), Dialog A has an edit box which I need to write to. In DialogB I want to write to the edit box of DialogA.
I want to use SetDlgItemText, however I was told I need to get a pointer to the first Dialog, but I don't know how.
Suggestions much appreciated
Kind Regards
Kevin
|
|
|
|
|
If dialog A is the parent of dialog B (which it sounds like it should be), you can simply call GetParent() anywhere from within dialog B.
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
Any idea how to create a hyperlink on a dialog so that when I click on the link it would open a document. I know it can be done using a button but would prefer if someone would show me how to implement a hyperlink
Kind Regards
Caoimh
|
|
|
|
|
You can find several hyperlink controls here[^]. Set the target to "file://myFile.txt ".
/ravi
My new year's resolution: 2048 x 1536
Home | Articles | Freeware | Music
ravib@ravib.com
|
|
|
|
|
Set Notify and Owner Draw style to the button (do not use Static control, because Static cannot be owner-drawn)
In draw routine, you should draw a blue underlined text
Handle a BN_CLICKED of the control:
ShellExecute(NULL, _T("open"), _T("http://www.mff.cuni.cz"), NULL, NULL,<br />
SW_SHOWNORMAL);
Enjoy!
Robert-Antonio
"Science is a differerntial equation.
Religion is a boundary condition."
|
|
|
|
|
Do I need to synchronize simple data types (int, DWORD, bool etc.), when I write to the (static) variable in one thread and read it in another. Does windows ensure that it will not switch to another thread during writing of one value? What do I have to remark.
Thanks for any answer.
Regards Konrad
|
|
|
|
|
different thread will not write or read or write/read the values at the same time... but a thread can set a bool value to false just after you have read it as true.
So that could cause a problem, Its better to have critical sections for these static variables.
P.R.A.K.A.S.H
|
|
|
|
|
But I think i need to declare the static variable with the keyword volatile, or is this not correct?
Konrad
|
|
|
|
|
yeah it should be volatile.
Jo hoga, Kuddhaye manjur hoga.
|
|
|
|
|
Look at the InterlockedExchange() and related calls.
(on a 80x86 based system, a bool or char will be read/written in an atomic operation, though I don't advise it outside of very narrow circumstances.)
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Thank you very much, that helps. But with InterlockExchange I must write a new value to a variable. What if I just want to read variable and ensure that this is atomic?
Do the variable have to be declared as volatile.
Sorry but the MSDN library is very short concerning this issue.
Konrad
|
|
|
|