|
If you are using MFC, then it is a bit easier.
Set the timer using SetTimer() .
Handle the WM_TIMER message, OnTimer() etc.
But this one is also not accurate. It skids slowly in one direction or the other until you have an error that is seconds long in a few hours.
The better timer available is the Multimedia timer .
Just look up WM_TIMER message and SetTimer() function, and you are on your way. Do all the processing in the OnTimer() function and without using any loop or Sleep() .
this is this.
|
|
|
|
|
You won't be able to have a precision under 10 or 15 msec (depends of the CPU load and other factors) because windows is not a real-time operating system. If you need to have such precision, you'll need to look for another OS.
Cédric Moonen
Software developer
Charting control
|
|
|
|
|
I think you can try to replace Sleep with QueryPerformanceCounter .
The code can look like this. First, get the frequency of high-resolution performance counter; this can be done once in your program:
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
Then, when you need a delay, use the following approach:
int const delay_ms = 500;
long long n = delay_ms * freq.QuadPart / 1000;
LARGE_INTEGER c;
QueryPerformanceCounter(&c);
long long const f = c.QuadPart + n;
do
{
QueryPerformanceCounter(&c);
} while( c.QuadPart < f);
Hope this solution will meet your requirements.
|
|
|
|
|
Sharath86 wrote: can anyone please give me some easy to understand code to do this replacement.
try QueryPerformanceCounter
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
I tried that and the error is worse than when i use Sleep.any other mechanisms like Timers or something. this is a DLL btw not in an MFC application...
|
|
|
|
|
Sharath86 wrote: btw not in an MFC application...
BTW the Way QueryPerformanceCounter and QueryPerformanceFrequency are Api not MFC Function!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
Which is a better way to return values and why?
1)
int Test(int n)<br />
{<br />
int nReturn = 0 ;<br />
<br />
if( n == 0 )<br />
{<br />
nReturn = 0 ;<br />
}<br />
else if( n == 1 )<br />
{<br />
nReturn = 1 ;<br />
}<br />
else<br />
{<br />
nReturn = -1 ;<br />
}<br />
<br />
return nReturn ;<br />
}
2)
int Test(int n)<br />
{<br />
if( n == 0 )<br />
{<br />
return 0 ;<br />
}<br />
else if( n == 1 )<br />
{<br />
return 1 ; <br />
}<br />
<br />
return -1<br />
}
---
With best regards,
A Manchester United Fan
The Genius of a true fool is that he can mess up a foolproof plan!
|
|
|
|
|
I prefer 2nd option
never say die
-- modified at 1:47 Tuesday 6th June, 2006
|
|
|
|
|
TechyMaila wrote: Which is a better way to return values and why?
I suggest another way
int Test(int n)
{
if(n==0 || n==1)
return n;
return -1;
}
Knock out 't' from can't,
You can if you think you can
|
|
|
|
|
Isn't it said that a good programming practice is to always return values at the end or rather just have one single return point?
---
With best regards,
A Manchester United Fan
The Genius of a true fool is that he can mess up a foolproof plan!
|
|
|
|
|
One more way:
inline int Test(int n)
{
return (n == 0 || n == 1) ? n : -1;
}
|
|
|
|
|
Viorel. wrote: return (n == 0 || n == 1) ? n : -1;
?: operator is slow.
Maxwell Chen
|
|
|
|
|
Maxwell Chen wrote: ?: operator is slow.
I do not think the ternary operator ?: is slower then an if statement, because in both cases the program is translated to the same series of microprocessor instructions, like CMP , JE , JMP . In my opinion, the ?: operator is a compact way for particular if , and makes the text shorter and probably clearer, but does not affect performance or code size.
|
|
|
|
|
My method is this way:
Build in Release mode, turn off the optimization.
int TestI(int n)
{
if(n==0 || n==1)
return n;
return -1;
}
int TestO(int n)
{
return (n == 0 || n == 1) ? n : -1;
}
void CTestDlg::OnBnClickedButton1()
{
DWORD s = GetTickCount();
for(UINT i = 0; i < 0xE00000; i++)
{
TestI(3);
}
DWORD e = GetTickCount();
DWORD d = e - s;
CString t;
t.Format("Time 0x%X", d);
AfxMessageBox(t);
}
void CTestDlg::OnBnClickedButton2()
{
DWORD s = GetTickCount();
for(UINT i = 0; i < 0xE00000; i++)
{
TestO(3);
}
DWORD e = GetTickCount();
DWORD d = e - s;
CString t;
t.Format("Time 0x%X", d);
AfxMessageBox(t);
} Result:
If-Else:
0xDC, 0xDC, 0xEC, 0xF0, 0xDC
? : operator:
0xFE, 0xF0, 0xFA, 0xF1, 0xFE
Maxwell Chen
|
|
|
|
|
I think it is not a problem if the compiler generates different code for looking-similar fragments when the optimization is turned off.
Since we are interested in faster code, we should turn the optimization on. But in this case we should take care that the compiler will not completely remove the fragments we investigate in our experiments. In order to prevent removing or in-lining of tested function and calls, we have to prepare our code using directives like volatile and __declspec(noinline) .
The experimental code for comparing code with optimizations can look like this:
int __declspec(noinline) TestI(int n)
{
volatile static int k = n;
if(n==0 || n==1)
return n;
return -1;
}
int __declspec(noinline) TestO(int n)
{
volatile static int k = n;
return (n == 0 || n == 1) ? n : -1;
}
void main()
{
const long N = 1000000000L;
DWORD s = ::GetTickCount();
for(long i = 0; i < N; ++i)
{
TestI(3);
}
DWORD t = ::GetTickCount() - s;
printf("%i\n", t);
s = ::GetTickCount();
for(long i = 0; i < N; ++i)
{
TestO(3);
}
t = ::GetTickCount() - s;
printf("%i\n", t);
}
In this case, the average time in case of VC++ 2003 compiler does not differ.
It should be more ways for performing accurate code-generation comparison in case the optimization is turned on.
In addition, this can be better checked by specifying a compiler option for generating intermediate Assembler code.
|
|
|
|
|
With your method,
NDEBUG, /MT, /Ot, /O2,
there is no difference between "if-else" and "?: operator" in the listing ASM code.
And regarding to the performance, ?: operator is a little faster.
Result:
9754 (if-else) (ignored, warm-up exercise)
9323 (? : ) (ignored, warm-up exercise)
9223 (if-else)
9214 (? : )
ASM code:
?TestI@@YAHH@Z PROC ; TestI, COMDAT
; 5 : volatile static int k = n;
mov eax, 1
test BYTE PTR ?$S1@?1??TestI@@YAHH@Z@4IA, al
jne SHORT $LN8@TestI
or DWORD PTR ?$S1@?1??TestI@@YAHH@Z@4IA, eax
mov DWORD PTR ?k@?1??TestI@@YAHH@Z@4HC, 3
$LN8@TestI:
; 6 : if(n==0 || n==1)
; 7 : return n;
; 8 : return -1;
or eax, -1
; 9 : }
ret 0
?TestI@@YAHH@Z ENDP ; TestI
?TestO@@YAHH@Z PROC ; TestO, COMDAT
; 13 : volatile static int k = n;
mov eax, 1
test BYTE PTR ?$S2@?1??TestO@@YAHH@Z@4IA, al
jne SHORT $LN8@TestO
or DWORD PTR ?$S2@?1??TestO@@YAHH@Z@4IA, eax
mov DWORD PTR ?k@?1??TestO@@YAHH@Z@4HC, 3
$LN8@TestO:
; 14 : return (n == 0 || n == 1) ? n : -1;
or eax, -1
; 15 : }
ret 0
?TestO@@YAHH@Z ENDP ; TestO
Maxwell Chen
|
|
|
|
|
Therefore, it seems that this compiler generates good enough code for both cases. We should be curious which behavior have other compilers in case of "if vs. ?:" problem.
|
|
|
|
|
Viorel. wrote: it seems that this compiler generates good enough code for both cases.
BTW, I am using VC++ 2005.
Maxwell Chen
|
|
|
|
|
or this
<br />
int Test(int n)<br />
{<br />
int nReturn = 0 ;<br />
switch(n)<br />
{<br />
case 0:<br />
case 1:<br />
nReturn=1;<br />
break;<br />
default:<br />
nReturn=-1;<br />
break;<br />
}<br />
return nReturn;<br />
}<br />
whitesky
|
|
|
|
|
PLZ HELPME SEND FULL CODE
how to fetch, store ,delete and update date in mysql table from MFC at run time from vc++ code(MFC)
PLZ SEND ME THIS CODE TO HELP THANKS FOR THIS
gourav dogra jfjunf
|
|
|
|
|
|
Hi,
I have lauchned an application B from my application A using ShellExecute() , it will return a Handle.
How can I track in application A that application B is closed at certain stage?
Thanks
Regards.
|
|
|
|
|
First of all what type of application you are creating.
Here you can chect the value of handle....
check if it exist...
Cheers
"Peace of mind through Technology"
|
|
|
|
|
Does it means that If when 2nd application is closed then the handle returned by ShellExecute will automaticlay become flase or expired or null.
Regards.
|
|
|
|
|