Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 757
  • Last Modified:

How to restart a thread in mfc

All,
Background:
I have an application that collects data from sensors on several com ports. Once all the data is collected I "do something" with it. Each sensor is interogated sequentially, based on its positon in a database. I have been tasked to collect data using multiple threads (1 for each com port that is active). My experience with threads is limited to a few worker threads here and there.

What I have done:
Created a class called "CComDataThread" that has the thread function
On start of program:
for(int i = 0; i < numberofComPortsInUse; i++)
{
    create a new comdatathread object;
    do some class init stuff
    set the thread autodelete to false
    create the thread suspended

    add the thread object to an object array for use later on when I need to collect data
   - a "poor mans" thread pool. (I don't know if this is the correct way to go about this yet...)
}

At some time later to collect data:
//for(int t = 0; t < threadpool.GetCount(); t++)  - just test one thread now
for(int t = 0; t < 1; t++)
{
   // get the thread object out of the array
   CComDataThread* pThread = (CComDataThread*)ThreadPool->GetAt(t);
    pThread->ResumeThread();
   
    DWORD wait =   WaitForSingleObject(pThread->m_hThread, INFINITE);
    if(wait == WAIT_OBJECT_0)
        break;   // thread has exited go do something with the data
}

This actually works - the thread launches and data collection occurs. The problem is when I need to colect data again - the thread won't run again.

I have a lot to learn about this stuff and I'm sure I'll be posting a lot more questions re multithreading, but for now all I want to do is figure out how to get my thread(s) to run and rerun...

(I can attach real code if needed)

Thanks
John


   


0
jhorstkamp
Asked:
jhorstkamp
  • 2
  • 2
1 Solution
 
Jaime OlivaresCommented:
this won't work because thread has ended. Just work when you Suspend a thread.
You have to create a new thread.
0
 
jhorstkampAuthor Commented:
Really?
Then what's the use of having a thread pool where all the threads are created suspended and then each thread is let run whenever needed? (Or do I completely misunderstand this?)
0
 
Jaime OlivaresCommented:
Have a look to this article: http://en.wikipedia.org/wiki/Thread_pool
The first paragraph says:
In the thread pool pattern in programming, a number of threads are created to perform a number of tasks, usually organized in a queue. Typically, there are many more tasks than threads. As soon as a thread completes its task, it will request the next task from the queue until all tasks have been completed. The thread can then terminate, OR SLEEP UNTIL THERE ARE NEW TASKS AVAILABLE.

so, you don't terminate a thread and launch again, just make it sleep with Suspend(), or better, the own thread sleeps (with Sleep() or other function) until it detects more data to process.
The goal of the pool is to keep track of the threads, create and destroy in a oportune moment.
0
 
jhorstkampAuthor Commented:
Thanks. I got laid off from the job that had that particular problem and lost interest and forgot about it...Good info for future use though.
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now