Timers
-
Hi everyone, I am trying to develop a Dialog based application for a device communicating through RS 232 serial Port. The serial port receives the new samples of data every 100 milli seconds. I am trying to display the message in a textbox and write the data to a file. For this purpose, i created a thread for receiving data. I am using a Timer with 100 milli seconds for Updating the textbox and writing the received data to the file. The Problem now i am facing is, when the file gets full, i am trying to display error message and stop the timer. But Timer is not getting stopped by KillTimer().Timer continues in the running state. BOOL MyDlg::OnInitDialog() { .... ... ConfigureSerialPort(); AfxBeginThread(Serial, NULL,THREAD_PRIORITY_NORMAL,0,0,NULL); return TRUE; } void CMyDlg::OnClickStart() { fp = fopen(file_name,"a"); if (NULL == fp) { MessageBox ("Error Writing File",NULL, MB_OK|MB_ICONSTOP); KillTimer(m_nTimer); } m_nTimer = SetTimer(1, 100, NULL); fprintf(fp,"%d\n",status); } void CMyDlg::OnTimer(UINT nIDEvent) { OnClickStart(); CDialog::OnTimer(nIDEvent); } UINT Serial(LPVOID pParam) { while(1) { DWORD dwBytesTransferred; ReadFile (hPort, inbuf, 60, &dwBytesTransferred, NULL); Sleep(100); } return TRUE; } Please help me regarding this problem. I am New to MultiThreading Concepts. Thanks. Chetan. Helping others satisfies you...
-
Hi everyone, I am trying to develop a Dialog based application for a device communicating through RS 232 serial Port. The serial port receives the new samples of data every 100 milli seconds. I am trying to display the message in a textbox and write the data to a file. For this purpose, i created a thread for receiving data. I am using a Timer with 100 milli seconds for Updating the textbox and writing the received data to the file. The Problem now i am facing is, when the file gets full, i am trying to display error message and stop the timer. But Timer is not getting stopped by KillTimer().Timer continues in the running state. BOOL MyDlg::OnInitDialog() { .... ... ConfigureSerialPort(); AfxBeginThread(Serial, NULL,THREAD_PRIORITY_NORMAL,0,0,NULL); return TRUE; } void CMyDlg::OnClickStart() { fp = fopen(file_name,"a"); if (NULL == fp) { MessageBox ("Error Writing File",NULL, MB_OK|MB_ICONSTOP); KillTimer(m_nTimer); } m_nTimer = SetTimer(1, 100, NULL); fprintf(fp,"%d\n",status); } void CMyDlg::OnTimer(UINT nIDEvent) { OnClickStart(); CDialog::OnTimer(nIDEvent); } UINT Serial(LPVOID pParam) { while(1) { DWORD dwBytesTransferred; ReadFile (hPort, inbuf, 60, &dwBytesTransferred, NULL); Sleep(100); } return TRUE; } Please help me regarding this problem. I am New to MultiThreading Concepts. Thanks. Chetan. Helping others satisfies you...
chetan210183 wrote:
The Problem now i am facing is, when the file gets full, i am trying to display error message and stop the timer. But Timer is not getting stopped by KillTimer().Timer continues in the running state.
This is because you are setting the timer again in
OnClickStart
. Why are you doing this? You don't have to set it again and again as you are doing now.chetan210183 wrote:
void CMyDlg::OnClickStart() { fp = fopen(file_name,"a"); if (NULL == fp) { MessageBox ("Error Writing File",NULL, MB_OK|MB_ICONSTOP); KillTimer(m_nTimer); } m_nTimer = SetTimer(1, 100, NULL); fprintf(fp,"%d\n",status); }
Look at the lines in bold. You first Kill the timer and then again you set it. So how can you expect it to stop at all.
chetan210183 wrote:
void CMyDlg::OnTimer(UINT nIDEvent) { OnClickStart(); CDialog::OnTimer(nIDEvent); }
Again inside the timer function you are calling
OnClickStart
which in turn again sets the timer. What you should be doing is...void CMyDlg::OnClickStart()
{
//set the timer here. Nothing else!
m_nTimer = SetTimer(1, 100, NULL);
}And now inside the timer function
void CMyDlg::OnTimer(UINT nIDEvent)
{
//write your timer related code here. Not anywhere else!
fp = fopen(file_name,"a");
if (NULL == fp)
{
MessageBox ("Error Writing File",NULL, MB_OK|MB_ICONSTOP);
KillTimer(m_nTimer);
}
}Note: Well this is just guess work about what you want to do. You will have to modify the above procedure based on your requirements
Nibu thomas Software Developer
-
Hi everyone, I am trying to develop a Dialog based application for a device communicating through RS 232 serial Port. The serial port receives the new samples of data every 100 milli seconds. I am trying to display the message in a textbox and write the data to a file. For this purpose, i created a thread for receiving data. I am using a Timer with 100 milli seconds for Updating the textbox and writing the received data to the file. The Problem now i am facing is, when the file gets full, i am trying to display error message and stop the timer. But Timer is not getting stopped by KillTimer().Timer continues in the running state. BOOL MyDlg::OnInitDialog() { .... ... ConfigureSerialPort(); AfxBeginThread(Serial, NULL,THREAD_PRIORITY_NORMAL,0,0,NULL); return TRUE; } void CMyDlg::OnClickStart() { fp = fopen(file_name,"a"); if (NULL == fp) { MessageBox ("Error Writing File",NULL, MB_OK|MB_ICONSTOP); KillTimer(m_nTimer); } m_nTimer = SetTimer(1, 100, NULL); fprintf(fp,"%d\n",status); } void CMyDlg::OnTimer(UINT nIDEvent) { OnClickStart(); CDialog::OnTimer(nIDEvent); } UINT Serial(LPVOID pParam) { while(1) { DWORD dwBytesTransferred; ReadFile (hPort, inbuf, 60, &dwBytesTransferred, NULL); Sleep(100); } return TRUE; } Please help me regarding this problem. I am New to MultiThreading Concepts. Thanks. Chetan. Helping others satisfies you...
You wrote:
void CMyDlg::OnClickStart() { fp = fopen(file_name,"a"); if (NULL == fp) { MessageBox ("Error Writing File",NULL, MB_OK|MB_ICONSTOP); KillTimer(m_nTimer); } m_nTimer = SetTimer(1, 100, NULL); fprintf(fp,"%d\n",status); }
for killing timer use
KillTimer(1);
i.e what ID you provided to set the timer The Timer returns the timer id when hwnd parameter of the settimer is NULL hope this is enough for you Knock out "T" from CAN'T You 'CAN' if you think you 'CAN' :cool:
-
You wrote:
void CMyDlg::OnClickStart() { fp = fopen(file_name,"a"); if (NULL == fp) { MessageBox ("Error Writing File",NULL, MB_OK|MB_ICONSTOP); KillTimer(m_nTimer); } m_nTimer = SetTimer(1, 100, NULL); fprintf(fp,"%d\n",status); }
for killing timer use
KillTimer(1);
i.e what ID you provided to set the timer The Timer returns the timer id when hwnd parameter of the settimer is NULL hope this is enough for you Knock out "T" from CAN'T You 'CAN' if you think you 'CAN' :cool:
A_Laxman wrote:
for killing timer use KillTimer(1); i.e what ID you provided to set the timer The Timer returns the timer id when hwnd parameter of the settimer is NULL
From MSDN: Return value of SetTimer: The timer identifier of the new timer if the function is successful. An application passes this value to the KillTimer member function to kill the timer. Nonzero if successful; otherwise 0.
Nibu thomas Software Developer
-
chetan210183 wrote:
The Problem now i am facing is, when the file gets full, i am trying to display error message and stop the timer. But Timer is not getting stopped by KillTimer().Timer continues in the running state.
This is because you are setting the timer again in
OnClickStart
. Why are you doing this? You don't have to set it again and again as you are doing now.chetan210183 wrote:
void CMyDlg::OnClickStart() { fp = fopen(file_name,"a"); if (NULL == fp) { MessageBox ("Error Writing File",NULL, MB_OK|MB_ICONSTOP); KillTimer(m_nTimer); } m_nTimer = SetTimer(1, 100, NULL); fprintf(fp,"%d\n",status); }
Look at the lines in bold. You first Kill the timer and then again you set it. So how can you expect it to stop at all.
chetan210183 wrote:
void CMyDlg::OnTimer(UINT nIDEvent) { OnClickStart(); CDialog::OnTimer(nIDEvent); }
Again inside the timer function you are calling
OnClickStart
which in turn again sets the timer. What you should be doing is...void CMyDlg::OnClickStart()
{
//set the timer here. Nothing else!
m_nTimer = SetTimer(1, 100, NULL);
}And now inside the timer function
void CMyDlg::OnTimer(UINT nIDEvent)
{
//write your timer related code here. Not anywhere else!
fp = fopen(file_name,"a");
if (NULL == fp)
{
MessageBox ("Error Writing File",NULL, MB_OK|MB_ICONSTOP);
KillTimer(m_nTimer);
}
}Note: Well this is just guess work about what you want to do. You will have to modify the above procedure based on your requirements
Nibu thomas Software Developer
Thanks for the Reply. But without a messagebox, the code excecutes properly. When messageBox is inserted it is leading to infinite loop. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/timers/timerreference/timermessages/wm\_timer.asp In the above link, they have mentioned a statement like below. "The WM_TIMER message is a low-priority message. The GetMessage and PeekMessage functions post this message only when no other higher-priority messages are in the thread's message queue. " So instead of Timers , can i use threads and loop the function? I mean replacing the Timers with Threads. Thanks. Chetan. Helping others satisfies you...
-
Thanks for the Reply. But without a messagebox, the code excecutes properly. When messageBox is inserted it is leading to infinite loop. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/timers/timerreference/timermessages/wm\_timer.asp In the above link, they have mentioned a statement like below. "The WM_TIMER message is a low-priority message. The GetMessage and PeekMessage functions post this message only when no other higher-priority messages are in the thread's message queue. " So instead of Timers , can i use threads and loop the function? I mean replacing the Timers with Threads. Thanks. Chetan. Helping others satisfies you...
chetan210183 wrote:
"The WM_TIMER message is a low-priority message. The GetMessage and PeekMessage functions post this message only when no other higher-priority messages are in the thread's message queue. "
Yeah.
chetan210183 wrote:
So instead of Timers , can i use threads and loop the function? I mean replacing the Timers with Threads.
Why not!
Nibu thomas Software Developer
-
chetan210183 wrote:
"The WM_TIMER message is a low-priority message. The GetMessage and PeekMessage functions post this message only when no other higher-priority messages are in the thread's message queue. "
Yeah.
chetan210183 wrote:
So instead of Timers , can i use threads and loop the function? I mean replacing the Timers with Threads.
Why not!
Nibu thomas Software Developer
Thanks a lot. Can u please suggest links where i can get sample programs on Threads replacing the Timers. Please...... Chetan. Helping others satisfies you...
-
Thanks a lot. Can u please suggest links where i can get sample programs on Threads replacing the Timers. Please...... Chetan. Helping others satisfies you...
chetan210183 wrote:
Can u please suggest links where i can get sample programs on Threads replacing the Timers. Please......
I don't know if this is what you are searching for. Here[^] is it. Well it has got some topics on which multithreading depends. Will make a good reading for you.
Nibu thomas Software Developer
-
Hi everyone, I am trying to develop a Dialog based application for a device communicating through RS 232 serial Port. The serial port receives the new samples of data every 100 milli seconds. I am trying to display the message in a textbox and write the data to a file. For this purpose, i created a thread for receiving data. I am using a Timer with 100 milli seconds for Updating the textbox and writing the received data to the file. The Problem now i am facing is, when the file gets full, i am trying to display error message and stop the timer. But Timer is not getting stopped by KillTimer().Timer continues in the running state. BOOL MyDlg::OnInitDialog() { .... ... ConfigureSerialPort(); AfxBeginThread(Serial, NULL,THREAD_PRIORITY_NORMAL,0,0,NULL); return TRUE; } void CMyDlg::OnClickStart() { fp = fopen(file_name,"a"); if (NULL == fp) { MessageBox ("Error Writing File",NULL, MB_OK|MB_ICONSTOP); KillTimer(m_nTimer); } m_nTimer = SetTimer(1, 100, NULL); fprintf(fp,"%d\n",status); } void CMyDlg::OnTimer(UINT nIDEvent) { OnClickStart(); CDialog::OnTimer(nIDEvent); } UINT Serial(LPVOID pParam) { while(1) { DWORD dwBytesTransferred; ReadFile (hPort, inbuf, 60, &dwBytesTransferred, NULL); Sleep(100); } return TRUE; } Please help me regarding this problem. I am New to MultiThreading Concepts. Thanks. Chetan. Helping others satisfies you...
You can mask the COM port, and wait for events happen in COM port and then only update the text box.