|
wxWidgets
Pssst. You see that little light on your monitor? That's actually a government installed spy camera. Smile and wave to big brother!
|
|
|
|
|
man, this crap is hard to read.
I recommend telling whoever is asking that they've greatly increased development time by not making this clear up front, and the rewriting it using a GUI framework that exists on both, or Java.
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
Since memmove() is the only buffer manipulation routine that guaranteed to copy the full source properly, is there any reason why we would want to use memcpy() instead of memmove()? I've since lots of people use memcpy() instead of memmove().
Thanks
|
|
|
|
|
I would say for performance, since memcpy wouldn't be performing the overlap checks. I imagine most of the time the gain would be so small that it's not worth the bother.
Pssst. You see that little light on your monitor? That's actually a government installed spy camera. Smile and wave to big brother!
|
|
|
|
|
So, you think that we should use memmove() instead?
|
|
|
|
|
memcpy() is slightly quicker because it doesn't do buffer overlap checks, and the compiler is more likely to inline it because the code is a fair bit smaller.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
OH! I'm stuck!
I have no idea what to do !!!
I created a dialog based application (as a matter of fact, my first REAL application).
from the main window I created another option window, over there the user can change the variables (just strings...) to custom his work.
the thing is that when the user will close the application all of his settings in the option window, obviously, will be deleted!
now, what I want to do is to let the user somehow the ability to save his
settings (the variables), and load them into a default file(for the example: "settings.dat" (without using an "open/save file" dialog from the CFileDialog class). in my quest to find the answer I read about serialization, but it really didn't do the job very well... I kept on getting errors and stuff (even by only declaring serialize in COption)
so my plan is: in the OnInit I will check IF the "settings.dat" exist (and I don't really know how to do that), if not, it will be created with default settings (I guess that is just saving, and by that the file will be created),
and if it does exist, it will be loaded.
and in the option window, using:
if(clsOption.DoModal() == IDOK)
in the main dialog, I will save the settings of the options.
so if all I wrote in the above is not a complete bullshit (sorry for the language), technically what I don't know what to do is how to check if the "settings.dat" exists or not, and HOW DO I SAVE AND LOAD???
I know these are big questions, but at least some clue.
I'm REALLY STUCK!
THANKS EVERYBODY!!!
|
|
|
|
|
For lots of different settings, you should use serialization, xml, registry, or something else.
However, in your case, I think you probably just want to save and load a few settings and you are probably just starting the whole GUI business (thats what I understand you mean by "REAL application" ). In that case I would use simple text based input/output to a text file, separating the different settings by some kind of delimeter (ie. a comma, a semi-column, or something like ;mysupercustomdelimiter). When you save to a text file settings.dat for ex., you separate all your settings by a comma. When you load you look for a comma and separate them into different settings. For actual text input/output you could use fstream's (ifstream/ofstream) I think.
This is not a very good solution in general, but it is probably enough to get you rolling.
If somebody feels this is a terrible advice, feel free to correct me and point out a better, SIMPLE way of storing settings.
Get used to getting stuck! It happens on daily basis when programming, at least to me.
|
|
|
|
|
sounds like a simple idea that I can deal with
but how do I read from within the file (the text itself?) and write to that text?
|
|
|
|
|
|
I read about CFile, CArchive and CFileDialog.
I tried what I read about serializing objects (MSDN), but I keep on getting errors on the declaration.
I'm trying to change my approch to this problem and try and use a text file (what the other guy who helped me suggested).
the only thing I can't find is ow to make my app read the text from within the text file.
|
|
|
|
|
Is it safe to have one thread periodically writing to a variable on the heap while another thread is constanly reading that variable?
I have two threads, a worker and GUI.
The worker HAS to be in a loop writing data. Now I need some way of stopping that loop from withing the GUI thread.
I thought, have a common variable "state". Constantly check that variable from withing the worker to make sure it(the worker) should still be working. Whenever I need it to stop, the GUI thread can change the "state" variable to "STOP_STATE" or something among those lines and the next time the worker checks that variable, it stops.
Something tells me this is a very wrong way of syncronizing two threads. Could someone please point me in the right direction.
Thanks in advance,
Nick Z.
|
|
|
|
|
Your situation is a simple one, and the simple solution you propose should be fine. Just make sure that only ever one thread writes to the variable. As soon as multiple threads write to the variable, you'll have to add synchronisation (mutex, critical section etc...) to make sure that multiple writes don't happen concurrently.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
For once something simple is the solution!
Thank you for clearing this up.
|
|
|
|
|
Additionally, the shared variable must be declared volatile , so that the compiler doesn't optimize away any reads/writes of the variable.
|
|
|
|
|
You should try using an event for this.
in the GUI thread:
<br />
m_hCancelEvent = CreateEvent(NULL, TRUE, FALSE, NULL);<br />
then pass the event handle to the worker thread in the AfxBeginThread call.
The GUI can then signal the worker (say via a Stop button) using:
<br />
SetEvent(m_hCancelEvent);<br />
and the worker can test for that signal in the thread procedure using WaitForSingleObject (or WaitForMultipleObjects if you're tracking multiple events)
<br />
if (::WaitForSingleObject(pYourThreadData->hCancelEvent, 0) == WAIT_OBJECT_0))<br />
else<br />
<br />
You need to close the event when your dialog closes:
<br />
CloseHandle(m_hCancelEvent);<br />
II)
If you need to read/write shared data between threads, it's best practice to use the appropriate sync object. This is a very simplified example.
<br />
static CCriticalSection g_criticalSection;<br />
static int* g_pSharedValue;<br />
In Thread 1:
<br />
CSingleLock singleLock(&g_criticalSection);<br />
<br />
singleLock.Lock();<br />
<br />
if (g_pSharedValue != NULL)<br />
{<br />
*g_pSharedValue += 8;<br />
<br />
*g_pSharedValue *= 2;<br />
}<br />
<br />
singleLock.Unlock();<br />
<br />
In Thread 2:
<br />
CSingleLock singleLock(&g_criticalSection);<br />
<br />
singleLock.Lock();<br />
<br />
delete g_pSharedValue;<br />
g_pSharedValue = NULL;<br />
<br />
singleLock.Unlock();<br />
<br />
Without the criticial section here, Thread 2 may execute the statement "delete g_pSharedValue", and then pass control to Thread 1. g_pSharedValue is corrupt, and causes Thread 1 to barf.
Pssst. You see that little light on your monitor? That's actually a government installed spy camera. Smile and wave to big brother!
|
|
|
|
|
Thank you for the excelent explanation.
I only need threading for a small portion of my program, and I didnt want to focus on the topic too much.
Your examples make my life so much easier. Thanks!
|
|
|
|
|
Hi !
I am compiling for UNICODE, a RichEditView in VC++ 6.0
A private variable prchars is defined in RichEditView Class.
In wordpad.h file
private:
char prchars[6];
********************************************************
In WordPadView.cpp in the constructor method I initialised the value
char prchars[0]='\0';
Now I am using
GetRichEditCtrl().ReplaceSel(prchars);
is giving an error
'ReplaceSel' : cannot convert parameter 1 from 'char [6]' to 'const unsigned short *'
even if i use
GetRichEditCtrl().ReplaceSel(_T(prchars)); it is not working. But it is working for constants in _T() ie.,
GetRichEditCtrl().ReplaceSel(_T("D"));
How can I use a character array variable prchars in the place of "D" ?
Thanks in advance.
Jai Srimannarayana
|
|
|
|
|
You have to replace the char declarations with TCHAR , like:
TCHAR prchars[0]='\0';
|
|
|
|
|
Thanks a lot. It worked fine.
" To distribute True knowledge to the right seeker is the best charity one can ever do is one's life. Blessed are those, for, they are specially loved by God "
Jai Srimannarayana
|
|
|
|
|
I Keep getting the following error when I try to compile my multithread code:
error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'UINT (LPVOID)'
Here is what I did:
I Declared my worker thread in my header file as such:
UINT Read(LPVOID Param);
This is the actual function as I have it in my code:
UINT CMyClass::Read(LPVOID Param)
{
CMyClass* pAppView= (CMyClass*)Param;
/*
*
*Code Here
*
*/
return 0;
}
And here is how I am calling the new Worker Thread from within my OnInitDialog() Function;
AfxBeginThread(Read,this);
I gathered all of this code from various articles on MFC Multithreading, but regardless I keep getting the error above. Can someone please tell me why The 'AfxBeginThread' statement is wrong? I have seen it done this way in the other articles.
Thanks
|
|
|
|
|
Hello,
You need to declare your worker thread function like at below;
UINT Read(LPVOID Param)
{
/*
*
*Code Here
*
*/
return 0;
}
Regards
Orkun GEDiK
SAP R/3 Software & System Support Specialist
ASTRON
|
|
|
|
|
Do you mean Declaring it in my header file like that?
If so, why? Wouldn't a simply deaclaration like such be enough:
UINT Read(LPVOID Param);
And if it does need to be a full function declaration like you said please explain to me why.
Thank you.
|
|
|
|
|
You can not call or pass the non-static member function of a class to AfxBeginThread.
You defined this:
UINT CMyClass::Read(LPVOID Param)
You need to make Read a stand-alone function.
Otherwise, in your header file, within the class, you need to declare it like this:
static UINT Read(LPVOID Param)
If it is declared as static, then
UINT CMyClass::Read(LPVOID Param)
is valid code.
|
|
|
|
|
did you ever heard of this pointer ?
when you write
UINT CMyClass::Read(LPVOID Param); the compiler understands
UINT CMyClass::Read(CMyClass* this, LPVOID Param);
so, the function header is not what you were expecting...
TOXCCT >>> GEII power [toxcct][VisualCalc]
|
|
|
|