|
I am currently working on wrapping a third-party control into a MFC-based .dll. I have gotten used to properties in C# and was wondering if there were any design or implementation issues related to the use of the following within my class to mimic properties in C++.
private int m_Count;
int getCount()
{
return m_Count;
}
void setCount(int i)
{
m_Count = i;
}
__declspec( property( get=getCount, put=setCount ) ) int Count;
- Nick Parker My Blog
|
|
|
|
|
|
Cool, Something new i learned today
"When death smiles at you, only thing you can do is smile back at it" - Russel Crowe (Gladiator)
|
|
|
|
|
Hi All,
I'm looking for a regular expression parser that is fairly easy to use/implement in an MFC program. I've looked at the boost libraries regex++, but it seems like over kill for what I want. Any info is appreciated. Thanks.
- monrobot13
|
|
|
|
|
Here is the problem I am having:
UINT WorkerThread(LPVOID pParam)
{
while (1==1)
{
UpdateData();
//do something
UpdateData(false);
}
return 0;
}
void main()
{
AfxBeginThread(WorkerThread, (LPVOID)this, THREAD_PRIORITY_NORMAL);
}
The UpdateData() function does not work in the Worker Thread. I have researched this quite a bit, and apparantly others were having the same problem. However, no one was able to come up with a straight answer. Anyone know how to use UpdateData() in a worker thread? Any help is appreciated.
-Dev578
|
|
|
|
|
Update data to what ? is it of the dialog? is so where is the pointer to the dialog window ?
I hope i answered ur question with questions.
"When death smiles at you, only thing you can do is smile back at it" - Russel Crowe (Gladiator)
|
|
|
|
|
I wan't the worker thread to update the data of the dialog.
|
|
|
|
|
UINT WorkerThread(LPVOID pParam)
{
<code>CMyDialog *mydlg_ptr = (CMyDialog *)pParam;</code>
while (1==1)
{
<code>mydlg_ptr->UpdateData();</code>
<code>mydlg_ptr->UpdateData(false);</code>
}
return 0;
}
void main()
{
AfxBeginThread(WorkerThread, (LPVOID)this, THREAD_PRIORITY_NORMAL);
}
would that make any difference?
|
|
|
|
|
I have tried that already, causes an assertion failure
-Dev578
|
|
|
|
|
whoops, sorry,
void main()
{
AfxBeginThread(WorkerThread, this, THREAD_PRIORITY_NORMAL);
}
get rid of (LPVOID)
|
|
|
|
|
UINT WorkerThread(LPVOID pThis)
{
CMYClass *pThisObject = static_cast<CMyClass *>(pThis);
while (1==1)
{
pThisObject->UpdateData();//do something
ThisObject->UpdateData(false);
}
return 0;
}
void main()
{
AfxBeginThread(WorkerThread, reinterpret_cast<CMYclass*>(this), THREAD_PRIORITY_NORMAL);
}
AND DEFINITLY THIS SHOULD WORK!!!! I HAD TRIED A LOT OF TIMES...NO ASSTER OR NO ERROR WERE OCCURED!!!
cheers
Balkrishna Talele
|
|
|
|
|
|
Can you elaborate about the updatedata function ? I mean how u are using it, it obviously not a MFC code. You are not clear with the question.
"When death smiles at you, only thing you can do is smile back at it" - Russel Crowe (Gladiator)
|
|
|
|
|
What I am doing is writing my own scripting language in MFC. It is done in a text box, the program recognizes functions that the user types in the text box, and executes them accordingly. The user might type something that loops repeadedly, in which case it would have to be done in another thread, as to not interfear with the main dialog. I have a value variable on the text box that I am using for functions like find(), mid(), etc... It only works if it has UpdateData() before it and UpdateData(false) after it. This works completely fine when done in the main thread, but I am having problems doing it in a worker thread. I have tried doing what J.B. suggested, but it caused an assertion failure. Any way to do this?
-Dev578
|
|
|
|
|
Did ya check what caused the assertion? Like is it because of invalid m_hWnd, You can do so by clicking on retry at the assertion box. It will take you to the line that caused the assertion.
Assertion is mostly called due to null pointers in MFC.
Thread will start doing its job the moment you created it in this case...
So it is calling update even before the window is created.
Instead in the thread do the following check
if(!::IsWindow(pDlg->m_hWnd))
{
return 0;
}
"When death smiles at you, only thing you can do is smile back at it" - Russel Crowe (Gladiator)
|
|
|
|
|
You can't (or shouldn't) access MFC objects between threads. The dialog is created and managed by the main thread, accessing the CDialog object from another thread will often fail, as you've seen. This is just how MFC works.
--Mike--
Personal stuff:: Ericahist | Homepage
Shareware stuff:: 1ClickPicGrabber | RightClick-Encrypt
CP stuff:: CP SearchBar v2.0.2 | C++ Forum FAQ
"That probably would've sounded more commanding if I wasn't wearing my yummy sushi pajamas."
-- Buffy
|
|
|
|
|
Hello Michel,
I have had seen many times, Coders doing this
UINT WorkerThread(LPVOID pThis)
{
CMYClass *pThisObject = static_cast<CMyClass *>(pThis);
while (1==1)
{
pThisObject->UpdateData();//do something
ThisObject->UpdateData(false);
}
return 0;
}
void main()
{
AfxBeginThread(WorkerThread, reinterpret_cast<CMYclass*>(this), THREAD_PRIORITY_NORMAL);
}
So is this still bad idea
cheers
Balkrishna Talele
|
|
|
|
|
In MFC you can't access any CWnd derived objects created in one thread from another, well at least not easilly. You will just get lots of ASSERT's in a Debug build and it simply won't work.
One way to do what you want is to use PostMessage() to post a WM_USER_xx message you define. Post this from the worker thread to the Dlg. In the dialog code add a MsgHandler for the WM_USER_xx msg and get it to call UpdateData(). This will work a treat.
Neville Franks, Author of ED for Windows www.getsoft.com and coming soon: Surfulater www.surfulater.com
|
|
|
|
|
I appreciate all of your help I think I understand it now, just having a slight problem. How do you make an eventhandler that fires when an integer changes? Again, thanks for all the help.
-Dev578
|
|
|
|
|
First off, remove the calls to UpdateData() , and use member control variables instead. Second, what you've created is a "worker" thread, or a thread with no message pump. A thread with no message pump should in no way be interacting with the UI. That is what a "UI" thread, or a thread with a message pump, is for. In the UI thread, simply post a message to the primary thread, the one that owns the UI, with what's to be updated.
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
|
I too have the same question...
if u find the answer ..plz share with me..
mshiraz@cordiant.net..
thanks a lot...
|
|
|
|
|
This is what I got ur question, so I am pasting the solution , see if it satisfy's you,
step 1) goto Start -> Run
2) Type Regedit
3)Click on
HKEY_CLASSES_ROOT
RIGHT CLIKC ON "*"
INSERT NEW KEY "SHELL" (DO NOT PUT QUOTES """")
RIGHT CLICK ON SHELL
INSERT NEW KEY "oPEN WITH SOMETHING" (DO NOT PUT QUOTES """")
RIGHT CLICK ON "oPEN WITH SOMETHING"
INSERT NEW KEY "COMMAND"
CLICK ON DOUBLE ( YOU WILL SEE (DEFAULT) ON RIGHT HAND SIDE
DOUBLE CLICK ON DEFAULT AND PASTE THE FOLLOWING STUFF
wmPLAYER.exe "%1"
The moment you click on any file you will get following menu!!!
-----------------------
copy
Open with Something
paste
delete
----------------------
this is what you want, I guess, if your question is something else, plz
feel free to re-phrase the question,
cheers
Balkrishna Talele
|
|
|
|
|
This is what I got ur question, so I am pasting the solution , see if it satisfy's you,
step 1) goto Start -> Run
2) Type Regedit
3)Click on
HKEY_CLASSES_ROOT
RIGHT CLIKC ON "*"
INSERT NEW KEY "SHELL" (DO NOT PUT QUOTES """")
RIGHT CLICK ON SHELL
INSERT NEW KEY "oPEN WITH SOMETHING" (DO NOT PUT QUOTES """")
RIGHT CLICK ON "oPEN WITH SOMETHING"
INSERT NEW KEY "COMMAND"
CLICK ON DOUBLE ( YOU WILL SEE (DEFAULT) ON RIGHT HAND SIDE
DOUBLE CLICK ON DEFAULT AND PASTE THE FOLLOWING STUFF
wmPLAYER.exe "%1"
The moment you click on any file you will get following menu!!!
-----------------------
copy
Open with Something
paste
delete
----------------------
this is what you want, I guess, if your question is something else, plz
feel free to re-phrase the question,
cheers
Balkrishna Talele
|
|
|
|
|
Or just call CWinApp::RegisterShellFileTypes() .
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|