Click here to Skip to main content
13,191,877 members (54,134 online)
Click here to Skip to main content
Add your own
alternative version


21 bookmarked
Posted 15 Apr 2004

Background Task Dialog

, 19 Apr 2004
Rate this:
Please Sign up or sign in to vote.
A wrapper for dialog boxes where you must do a long-time process but you don't want your application to appear to be HUNG.

Sample screenshot


Hi, my name is Mauro H. Leggieri, a Windows and Game programmer. I made a little thing that may be useful, and want to share with you.

I wrote a class named CBackgroundTaskDialog derived from the standard CDialog class. It is a wrapper for dialog boxes where you must do a long-time process, optionally showing the progress information, but you don't want your application to appear to be hung.

Using the code

The code simply creates a background thread and calls some member functions where you write your own code and have some members to control when to start/stop the background process.

To use the code in your project, first add the BackgroundTaskDialog.cpp and BackgroundTaskDialog.h files to your project.

Then, in the header file of the dialog you want to subclass, add the include "BackgroundTaskDialog.h" statement and replace all CDialog words with CBackgroundTaskDialog and add the following member declarations to the class:

class your_dialog_class : public CBackgroundTaskDialog
  // Class definition an so on...
  // Code that you must add to the class:

  void RunBackgroundTask();

After this, replace in the CPP file of the dialog all CDialog words with CBackgroundTaskDialog too and add the following members code:

void your_dialog_class_name::RunBackgroundTask()
  //Here you should add the code for the long-term process to do
  //At regular intervals you should call then 
  //CheckForBackgroundTaskAbort function
  //to check for an abort signal. If the function 
  //returns TRUE, usually simply return

To start the background process, you must use the StartBackgroundTask function. It returns a value of 1 if all is ok or less than 0 if an error occurs. The function is usually used in the OnInitDialog function.

BOOL your_dialog_class_name::OnInitDialog()
  // Code added by MFC AppWizard and your own code

  // Example code to add:

  if (StartBackgroundTask() < 0)
     PostMessage(WM_CLOSE, 0, 0);
     return TRUE;

  return TRUE;

At last, if you want to abort the background process, call the StopBackgroundTask function.

See the example project because it has more explanations.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Mauro Leggieri
Web Developer
Argentina Argentina
My name is Mauro Leggieri. I am 30 year-old, married and have a child.

I am a system engineer (UTN university) and am being programming for more than 20 years from the C64 to the PC and some microcontrollers.

Mostly of my time, I program games for Windows.

Soon, my site

You may also be interested in...

Comments and Discussions

QuestionCan we achieve this without a &amp;quot;Dialog&amp;quot; [modified] Pin
IScribe3-Jun-07 15:25
memberIScribe3-Jun-07 15:25 
GeneralSome remarks Pin
cristitomi22-Mar-07 5:54
membercristitomi22-Mar-07 5:54 
In functions OnBtnStartStop() and RunBackgroundTask() from the demo dialog class, try and avoid the CWnd* wnd pointer. It's useless and it's more prone to errors. The functions simply could look like this:
void CBackgroundTaskDialogDemoDlg::OnBtnStartStop() 
    // Check if the background process is running
    if (IsBackgroundTaskRunning() == FALSE) 
	// Start background process
	if (StartBackgroundTask() < 0) 
		_T("Error: Cannot start background thread."));
	// Abort background process
	GetDlgItem(IDC_STC_PROGRESS)->SetWindowText(_T("Thread was 

void CBackgroundTaskDialogDemoDlg::RunBackgroundTask()
    TCHAR buf[1024];
    int i;
    for (i = 0; i < 500; i++) 
	// Check if I have to abort
	if (CheckForBackgroundTaskAbort() != FALSE)
	// Update status text
	_stprintf(buf, _T("Counting %ld of 500"), i+1);
	// Mini delay
    // Update status text
    GetDlgItem(IDC_STC_PROGRESS)->SetWindowText(_T("Thread has finished 

The code is also more readable.

I am in love with VC++
GeneralRe: Some remarks Pin
Mauro Leggieri22-Mar-07 9:51
memberMauro Leggieri22-Mar-07 9:51 
GeneralRe: Some remarks Pin
cristitomi22-Mar-07 12:38
membercristitomi22-Mar-07 12:38 
GeneralRe: Some remarks Pin
Mauro Leggieri23-Mar-07 3:35
memberMauro Leggieri23-Mar-07 3:35 
GeneralRe: Some remarks Pin
Member 369115-Mar-09 0:34
memberMember 369115-Mar-09 0:34 
GeneralRe: Some remarks Pin
Mauro Leggieri15-Mar-09 10:23
memberMauro Leggieri15-Mar-09 10:23 
GeneralRe: Some remarks [modified] Pin
Member 369115-Mar-09 15:25
memberMember 369115-Mar-09 15:25 
GeneralRe: Some remarks Pin
Mauro Leggieri16-Mar-09 7:15
memberMauro Leggieri16-Mar-09 7:15 
Questionwhat to do when using multiple base class? Pin
_kane_27-Dec-05 8:21
member_kane_27-Dec-05 8:21 
AnswerRe: what to do when using multiple base class? Pin
Mauro Leggieri27-Dec-05 8:50
memberMauro Leggieri27-Dec-05 8:50 
GeneralRe: what to do when using multiple base class? Pin
_kane_29-Dec-05 7:04
member_kane_29-Dec-05 7:04 
GeneralRe: what to do when using multiple base class? Pin
Mauro Leggieri29-Dec-05 8:49
memberMauro Leggieri29-Dec-05 8:49 
GeneralRC -4 after 85 DoModal()s Pin
Anonymous29-Jun-05 3:40
sussAnonymous29-Jun-05 3:40 
GeneralRe: RC -4 after 85 DoModal()s Pin
MX-Mauro29-Jun-05 12:36
memberMX-Mauro29-Jun-05 12:36 
QuestionAny new version? Pin
Anonymous23-Mar-05 14:23
sussAnonymous23-Mar-05 14:23 
AnswerRe: Any new version? Pin
MX-Mauro29-Jun-05 13:00
memberMX-Mauro29-Jun-05 13:00 
GeneralRe: Any new version? Pin
dennisV17-Aug-05 21:56
memberdennisV17-Aug-05 21:56 
GeneralRe: Any new version? Pin
MX-Mauro18-Aug-05 1:29
memberMX-Mauro18-Aug-05 1:29 
GeneralRe: Any new version? Pin
Anonymous18-Aug-05 3:43
sussAnonymous18-Aug-05 3:43 
GeneralRe: Any new version? Pin
dennisV18-Aug-05 3:45
memberdennisV18-Aug-05 3:45 
GeneralRe: Any new version? Pin
MX-Mauro18-Aug-05 7:40
memberMX-Mauro18-Aug-05 7:40 
GeneralBackgound process Pin
Emmanouel22-Jun-04 1:29
memberEmmanouel22-Jun-04 1:29 
GeneralRe: Backgound process Pin
MX-Mauro22-Jun-04 4:15
memberMX-Mauro22-Jun-04 4:15 
GeneralSingle-threaded application Pin
maciejr9-May-04 21:19
membermaciejr9-May-04 21:19 
GeneralRe: Single-threaded application Pin
MX-Mauro10-May-04 2:05
memberMX-Mauro10-May-04 2:05 
GeneralRe: Single-threaded application Pin
dis14119-Dec-06 21:57
memberdis14119-Dec-06 21:57 
GeneralProgram crashed. Pin
WREY16-Apr-04 11:59
memberWREY16-Apr-04 11:59 
GeneralRe: Program crashed. Pin
MX-Mauro16-Apr-04 12:03
memberMX-Mauro16-Apr-04 12:03 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.171017.2 | Last Updated 20 Apr 2004
Article Copyright 2004 by Mauro Leggieri
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid