|
Mmmhhh, won't have problems with that method ? You are accessing an MFC object from two different threads. I think you will get troubles with (but I'm not sure, I never pass MFC objects across different threads).
Take a look here[^], specifically at the Windows Handle Maps section.
Cédric Moonen
Software developer
Charting control
|
|
|
|
|
I have read that we can pass C++ object to other thread which is derived from CObject. Also we must ensure the existence of the object.
nave
|
|
|
|
|
Hi naveen i tried this code but its not working dont know what is the problem
|
|
|
|
|
|
i have a timer. on click of a button this timer starts.i want the progress bar to start on click of the button and end when the timer is killed
UINT WorkerThreadProc(LPVOID Param)
{
CStatusDlg* status = (CStatusDlg *)Param;
// I want the process bar to start here
INDX.startIndex();
// I want the process bar to stop here
KillTimer(status->m_hWnd, ELAPSED_TIMER);
return true;
}
how to do this?
|
|
|
|
|
Then why r u creating a thread..U can step the progress bar in the OnTimer()
funtion..isn't it?
nave
|
|
|
|
|
this is my ontimer() function. how can i step progress bar here? how do i ensure that the progress bar stops once timer is killed
void CStatusDlg::OnTimer(UINT nIDEvent)
{
CStatusDlg* status = (CStatusDlg *)Param;
if(nIDEvent == ELAPSED_TIMER)
{
time(&lStopTime);
cteElapsedTime = CTimeSpan(lStopTime-lStartTime);
CString csElapsedTime;
csElapsedTime.Format("%02d:%02d:%02d",
cteElapsedTime.GetHours(),
cteElapsedTime.GetMinutes(),
cteElapsedTime.GetSeconds());
if(IsWindowVisible())
{
m_TIME.SetWindowText(csElapsedTime);
}
}
|
|
|
|
|
Before calling the SetTimer initialize the progress bar
m_ProgressBar.SetRange( 0, 100 );<br />
SetTimer( ELAPSED_TIMER );
now in the timer function
void CStatusDlg::OnTimer(UINT nIDEvent) <br />
{<br />
if(nIDEvent == ELAPSED_TIMER)<br />
{<br />
m_ProgressBar.StepIt();<br />
time(&lStopTime);<br />
cteElapsedTime = CTimeSpan(lStopTime-lStartTime); <br />
CString csElapsedTime;<br />
csElapsedTime.Format("%02d:%02d:%02d", <br />
cteElapsedTime.GetHours(),<br />
cteElapsedTime.GetMinutes(),<br />
cteElapsedTime.GetSeconds());<br />
if(IsWindowVisible())<br />
{<br />
m_TIME.SetWindowText(csElapsedTime);<br />
}<br />
}<br />
}
nave
|
|
|
|
|
Thank you naveen for your help. i am getting following errors in
CStatusDlg* status = (CStatusDlg *)Param;
m_Progress_Bar.SetRange( 0, 100 ); time(&lStartTime);
SetTimer(status->m_hWnd,ELAPSED_TIMER, 1000, NULL);
if i comment that line i dont get any errors. in ontimer() function i am using m_ProgressBar.StepIt(); directly but here its not giving any error. what cud be wrong?
error C2065: 'm_Progress_Bar' : undeclared identifier
error C2228: left of '.SetRange' must have class/struct/union type
Thanks
|
|
|
|
|
ho man... m_ProgressBar is the control variable for the progress control
replace m_ProgressBar with the control varaiable u created for the progress bar..
nave
|
|
|
|
|
hey sorry typing mistake. my control variable is m_Progress_Bar.
in ontimer() function this is not giving any error i.e
m_Progress_Bar.StepIt();(no error here).
but this is giving error
m_Progress_Bar.SetRange( 0, 100 );
if i comment m_Progress_Bar.SetRange( 0, 100 ); then it gives no error
|
|
|
|
|
|
error C2065: 'm_Progress_Bar' : undeclared identifier
error C2228: left of '.SetRange' must have class/struct/union type
|
|
|
|
|
From which funtion did u call the
m_Progress_Bar.SetRange( 0, 100 );function?
I think u have called this function from a static function or global funtion or a function in another class..
nave
|
|
|
|
|
yes its in a separate function.whats the solution for this?can i use it without setting the range? the other declaration i.e m_Progress_Bar.StepIt(); is in a different function i.e ontimer() but this isn't giving any error
-- modified at 8:49 Friday 19th May, 2006
|
|
|
|
|
sudeep_br wrote: yes its in a separate function
does this function belong to the same class and a non static one?
if so u should have to pass the pointer of the m_Progress_Bar to this function and then u can access the progress bar from that function
nave
|
|
|
|
|
Hi naveen.Thank You for all your help.
I am performing the operation of file indexing. i am using the timer to keep track of the time taken by the computer to generate file index. when the indexing begins the progress bar will start, since its called in the ontimer() function as suggested by you. but the problem here is that since the progress bar is inside the timer, after indexing is over, when the timer stops,progress bar also stops. sometimes it so happens that the progress bar stops in the middle becoz of calling it in timer. is it possible to ensure that the progress bar doesnt stop in the middle?
|
|
|
|
|
This can be only done if u exactly know how many times the timer will be called.. Suppose the timer will be calle only five times.. thne before calling the settimer, u must call the SetRange(0,5)..
nave
|
|
|
|
|
The bar won't move alone, you have to constantly step it yourself during the process (call the Step function). If you want to update the bar from within your thread, the best way to do it is to send user-defined messages to your status dialog. Write then a handler function in your dialog class for these messages and step the bar in it.
Cédric Moonen
Software developer
Charting control
|
|
|
|
|
for easy and secure access make the worker thread static to the class and pass the object to the thread function. that is the standard way to do that.
just press "." after your object visual studio will show the whole functions. it is easy to understand "SetScrollRange" and "SetScrollPos" etc.
-Sarath
|
|
|
|
|
Never manipulate GUI object from a worker thread!
Read this[^] excellent article about how to use worker threads and why you should not touch GUI parts from worker threads.
--
Roger
It's supposed to be hard, otherwise anybody could do it!
Regarding CodeProject: "resistance is pointless; you will be assimilated"
|
|
|
|
|
sudeep_br wrote: UINT WorkerThreadProc(LPVOID Param)
{
CStatusDlg* status = (CStatusDlg *)Param;
// I want the progress bar to start here
INDX.startIndex();
// I want the progress bar to stop here
return true;
}
Create a GUI thread. The one you are creating is a worker thread which is not meant for GUI manipulation.
Nibu thomas
Software Developer
Faqs by Michael dunn
|
|
|
|
|
Since you are a beginner, especially with threads, I would advise you to read about worker threads and UI threads.
The WorkerThreadProc() function should not touch the UI (since it does not own it). Have it post a message back to the primary thread (the one that owns the UI).
Threads are usually not something that a beginner should embark on, especially when so many other fundamental subjects have yet to be learned.
"The largest fire starts but with the smallest spark." - David Crow
|
|
|
|
|
I am trying to build an application that draws images, scrolls, draws lines and all that. I use the device context by calling GetDC() and I then call CreateCompatibleDC to get a second DC. In first instance, I drew the current image using the original DC, then copied the complete image usging BitBlt into the compatible DC. When scrolling, or restoring pieces of the image when drawing a line for example, I tried to copy the relevant part of the iamge back into the original DC from the compatible DC using BitBlt, but nothing happens. Next, I tried inversing the process, by passing the compatible DC to the drawing functions, and then copying the completed image into the original DC, but again, this leaves me with a blank screen.
Code snippet:
m_pDC = GetDC ();
m_CompatibleDC.CreateCompatibleDC (m_pDC);
DrawSomething (&m_CompatibleDC); // This also fills a RECT structure
// with the dimensions of the generated
// image: m_RectDC
BOOL r = m_pDC->BitBlt (0, 0, m_RectDC.right, m_RectDC.bottom, &m_CompatibleDC, 0, 0, SRCCOPY);
The return value of BitBlt is 1, so it claims everything went well, but again: nothing happens. The drawing functions do work, since if I pass m_DC into them in stead of &m_CompatibleDC, I get what I expect directly on screen.
Anyone any ideas?
Thanks in advance
William
|
|
|
|
|
I'm not sure,
have u selected bitmap object before drawing?
-Sarath
|
|
|
|