Calling any multi-thread wizards. Here is a copy of the relevant parts of my main function...
CWinApp theApp; //the application's handle? not sure...
using namespace std;
UINT callProcessThread(LPVOID minutesSpent); //worker thread function, process output
UINT initializeProgram(LPVOID flag); //worker thread function, load MCR
void inputCalculateOutput(void); // function that sorts data and calls callProcessThread
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{ HANDLE threadHand = GetCurrentThread();
CWinThread *startThread;
int nRetCode = 0, priority;
SetPriorityClass(threadHand, HIGH_PRIORITY_CLASS);
SetThreadPriority(threadHand, THREAD_PRIORITY_NORMAL);
//initialize the MCR
startThread = AfxBeginThread(initializeProgram,
&nRetCode,
THREAD_PRIORITY_HIGHEST);
std::cout << "Initializing, please wait.\n";
// initialize MFC and print and error on failure
while(INFINITE)
{if(WaitForSingleObject(*startThread, INFINITE)
== WAIT_OBJECT_0)
{//select a priority class for the program...
std::cout << "Select a priority class for the program\n"
<< "1) Idle\n2) Below Normal\n3) Normal\n4) Above Normal\n"
<< "5) High\n6) Highest\n\n >> ";
if(std::cin >> priority)
{
switch(priority)
{
case 1:
SetPriorityClass(threadHand,IDLE_PRIORITY_CLASS);
SetThreadPriority(threadHand,THREAD_PRIORITY_BELOW_NORMAL);
break;
case 2:
SetPriorityClass(threadHand,BELOW_NORMAL_PRIORITY_CLASS);
SetThreadPriority(threadHand,THREAD_PRIORITY_BELOW_NORMAL);
break;
case 3:
SetPriorityClass(threadHand,NORMAL_PRIORITY_CLASS);
SetThreadPriority(threadHand,THREAD_PRIORITY_NORMAL);
break;
case 4:
SetPriorityClass(threadHand,ABOVE_NORMAL_PRIORITY_CLASS);
SetThreadPriority(threadHand,THREAD_PRIORITY_ABOVE_NORMAL);
break;
case 5:
SetPriorityClass(threadHand,HIGH_PRIORITY_CLASS);
SetThreadPriority(threadHand,THREAD_PRIORITY_HIGHEST);
break;
case 6:
SetPriorityClass(threadHand,REALTIME_PRIORITY_CLASS);
SetThreadPriority(threadHand,THREAD_PRIORITY_TIME_CRITICAL);
break;
}
inputCalculateOutput(); //take input, calculate output...
break;
}
else
{cin.ignore(100000,'\n');
cin.clear();
break;
}
}
}
return nRetCode;
}
As you can see, I am trying to allow the user to set the priority class of the program through the command line. No matter what selection is made, when I check the priorities through task manager application.exe is always 'normal' priority. Additionally I cannot make one instance of application.exe run with priority over another instance of application.exe. Should I switch threadHand
for theApp
? or am I doing something else wrong? Does anyone know of a sure fire way for me to set the priority class of my program? (For example explorer.exe defaults to 'High' priority according to task manager... I want to be able to do that!) Is there a utility to view threads and how they tick on and off of the processor?