|
talkster5 wrote:
The char test is the one that I need
Since test is not being used, why do you need it at all?
What does CIni::GetChar() return? More importantly, what is the third parameter supposed to be? I'm not sure why the class differentiates between getting a char vs. getting a string , but in any case, you need to change your code to the following in order to pacify the compiler:
char test = ini.GetChar(_T("History"), _T("Input"), ' '); Why are you mixing _T() and TCHAR() ? That in itself doesn't hurt anything but it does make your code hard to read.
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
The information for the shellexecute is going to be stored in an ini file so at the moment I am just testing getting the information from an ini file which is why the char test is there but now I need it to be a char* so I can actually use it in the shellexecute as when I compile it says shellexecute can only use char* and not char.
|
|
|
|
|
You cannot use the GetChar() method to retrieve a char* value. Which parameter of ShellExecute() is in error?
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
The Program, Paramaters and working directory all do not work if its just char.
|
|
|
|
|
Right. ShellExecute() does not use any char parameters. Without seeing the code that is in error, I can't provide anything useful.
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
What do you mean the code that is in error? The code I posted above is the only code I have in the program at the moment. Do you want the actual error message from the compiler?
|
|
|
|
|
talkster5 wrote:
Do you want the actual error message from the compiler?
That would help tell us what exactly the error you are getting is.
|
|
|
|
|
There is nothing wrong with the call to ShellExecute() . The error, as I've already pointed out, is in the call to GetChar() . Correct that and you'll be on your way.
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
Yes, but what over way can I get a char* from an ini file as that was the only function that I thought would work seen as I am storing characters in my ini file.
|
|
|
|
|
OK, then try GetPrivateProfileString
This returns a string from the ini file. I hope this will solve ur problem.
"I would luv to change the world, but they wont give me the source code"
My Articles
|
|
|
|
|
Unless you have a compelling reason to use the CIni class, why not simplify things and use GetPrivateProfileString() instead? Something like:
char szBuffer[128];
GetPrivateProfileString("History", "Input", "", szBuffer, sizeof(szBuffer),
"D:\\Programs\\Microsoft Visual Studio\\MyProjects\\Prog12\\Debug\\IniDemo.ini");
...
ShellExecute(...);
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
Thanks for the code David. In my ShellExecute where I want the value to go to I put szBuffer or what do I put please?
|
|
|
|
|
talkster5 wrote:
In my ShellExecute where I want the value to go to I put szBuffer or what do I put please?
I do not know enough about the problem to answer this. For example, what does the .ini file look like?
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
My ini is like this but I have changed it from History and Input to the correct settings when getting the information.
[Settings]
Path=notepad.exe
Paramaters=
WorkingDirectory=
So in the ShellExecute I would want to get all 3 values and put them into the ShellExecute so it can run it.
|
|
|
|
|
char szPath[_MAX_PATH],
szParameters[_MAX_PATH],
szWorkingDir[_MAX_PATH];
GetPrivateProfileString("Settings", "Path", "", szPath, sizeof(szPath),
"D:\\Programs\\Microsoft Visual Studio\\MyProjects\\Prog12\\Debug\\IniDemo.ini");
GetPrivateProfileString("Settings", "Parameters", "", szParameters, sizeof(szParameters),
"D:\\Programs\\Microsoft Visual Studio\\MyProjects\\Prog12\\Debug\\IniDemo.ini");
GetPrivateProfileString("Settings", "WorkingDirectory", "", szWorkingDir, sizeof(szWorkingDir),
"D:\\Programs\\Microsoft Visual Studio\\MyProjects\\Prog12\\Debug\\IniDemo.ini");
ShellExecute(NULL, "open", szPath, szParameters, szWorkingDir, SW_SHOW);
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
Thanks for the help I really appreciate it and it works great.
|
|
|
|
|
One last thing actually. Is there a way that instead of having the ini path hard coded I can just make it look where the project exe is being run from and then just //IniDemo.ini?
|
|
|
|
|
Assuming that GetChar() returns a character and takes 3 char* as arguments, then the third argument is wrong. Of course the third argument would be wrong any way.
TCHAR('C') is equivalent to char('C') or (UNICODE) wchar_t('C')
_T('C') is equivalent to 'C' or (UNICODE) L'C'
_T("String") is equivalent to "String" or (UNICODE) L"String"
TCHAR("String") is invalid; because you are trying to convert a char* into a char.
Of course if your intention is to take the low-byte of the address of the string "NoneSet", then my assumptions are all wrong and there is nothing wrong with that line of code.
I am a day late, but I hope that helps.
INTP
"The more help VB provides VB programmers, the more miserable your life as a C++ programmer becomes."
Andrew W. Troelsen
|
|
|
|
|
Question on How SetTimer() Works:
When the Timer goes off and it calls the OnTimer() function, does it wait until that function ends and the program returns to the OS before the Timer starts its countdown again or does it automatically restart the countdown once the OnTimer() function is called?
My Reason for asking is this:
I made a Multithreaded MFC serial communication program where the flow of data is continuous. Thus the way I have it is I use an Infinite loop of (Read data, do something with data and loopback to read more data), however this causes the cpu time to be completely used (99-100%). Now since the program is much faster then the flow of data what I want to do is: Read data, do something with it, then return to the OS then go back to the read routine and do it again so the cpu is used as minimally as possible.
This is where my question comes in: How could I go about being able to recall the read function once I return to the OS. As per my first question I was thinking of using SetTimer() but I dont know if it is the best possible solution to the problem. Maybe some type of event could work, but I dont think it could be monitored if the program control is with the OS.
Does anyone have any advice or answers to my 2 questions?
Thanks
|
|
|
|
|
A simple test - put an AfxMessageBox() in the OnTimer() funtion, set the timer period to say 3 seconds, let the message box stay open for say 2 seconds.
Elaine
The tigress is here
|
|
|
|
|
ONTIMER: (this all most application need)
Since the the data received (using Windows serial communication) is received/sent in the background, you can use the SetTimer() function and just check if any new data has arrived in your OnTimer() event function. How often you need to check depends on the size of the receive buffer you specified when you setup communication (See SetupComm()). To detemine if any data has been received just call ClearCommError().
MULTITHREADING:
Of course you could use a seperate thread that uses shared data buffers, protected by critical sections so your threads will not step on each others toes. What I mean by shared buffers is one or more buffers you and the Rx thread both share, when you're reading from a buffer, the RX thread cann't write to it and when the RX thread is writing to it, you cann't read from it. Then all you need to do is calculate approximatly how long it should take to receive X-number of characters and go to sleep for that period of time in your RX thread; when the thread wakes up it then reads the data into the buffer and goes back to sleep (that takes care of the CPU usage problem).
You could use two buffers so that the RX thread could be writing into one while you are reading the other one.
OR
you could use a ring buffer so that you can read from the tail end while the receiver is writing to the head end. (this can be a bit more tricky).
The RX thread can inform you that new data has arrived by posting (not sending) a message back to your main thread or by setting an event flag that you must check for every now and then, either in an OnTimer() event function or in the main message loop.
FINALY:
That should be enough to help solve your problems.
FYI:
There are some articles at CP (CSerial) and in the MSDN library that use multiple threading for serial communication.
GOOD LUCK!
INTP
"The more help VB provides VB programmers, the more miserable your life as a C++ programmer becomes."
Andrew W. Troelsen
|
|
|
|
|
thank you for the detailed response. In my original post I failed to mention that I am using shared buffers and as you mentioned it is much better then using one buffer.
I have been doing some debugging of the cpu hogging problem and it has come down to be either the infinite for loop that is causing it or the actual worker thread itself.
I call the worker thread like this:
AfxBeginThread(Read,this);
Read() is a static menber function declared as:
afx_msg static UINT Read(LPVOID param);
As I was told this was how it was supposed to be declared. Here is the Read() function minus the background work:
<br />
UINT CprogramDlg::Read(LPVOID param)<br />
{<br />
for( ;; ) {}<br />
return 0;<br />
}<br />
Reason I am not including the code within the "for" loop is because after testing I have concluded that even with just the code like this when the Read() function is called from AfxBeginThread() the cpu immediately shoots up to 99% and stays there.
So from this I have to conclude that it is either the "infinite for loop" that is causing it or it is the actual thread call that is doing it. It was pointed out to me that an infinite loop in a worker thread "should not" cause the cpu usage to jump up completely like that, but I dont know how true that is. I just want to make sure that it is the infinite loop before I move onto fix the problem by using a timer.
Thanks
|
|
|
|
|
The worker thread is causing the cpu usage problem, it must go to sleep part of the time if you want it to stop doing that. Even just using WaitCommEvent(...,EV_RXCHAR,...) inside your loop might reduce cpu usage (how much depends on baudrate). I would just use SetupComm(...,dwInQueue,dwOutQueue) and go to sleep for a short time, before reading the data from the rx-buffer.
INTP
"The more help VB provides VB programmers, the more miserable your life as a C++ programmer becomes."
Andrew W. Troelsen
|
|
|
|
|
Hi
I have a third party product which exposes an api (dll/type library).
What i want to do is create a dll using some of the functions/classes/interfaces provided by the api for e.g retireve some product related information and use the notification engine to send emails etc.
This newly created dll is then going to be consumed by an application.
I am new to vc++ and have no clue how to go about creating this dll. Can somebody tell me the steps to achieve this?
I need to meet a deadline and have no clue how to go about doing it.
Any help would deeply appreciated
Regards
|
|
|
|
|
What I want to do is take an input from the user to set up a grid. This grid is a multi- dimensional array. I can do this with a simple array (1-D) and create the object as new. But when I try this with a multi- dimensional I get the error "constant expression expected."
If only I had more time!
|
|
|
|