File: MultipleMethodExecute.cxx

package info (click to toggle)
openigtlink 3.0.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,080 kB
  • sloc: cpp: 20,076; ansic: 6,704; sh: 227; perl: 74; makefile: 46
file content (132 lines) | stat: -rw-r--r-- 3,608 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*=========================================================================

  Program:   OpenIGTLink Library -- Example for Thread (Multiple Methods)
  Module:    $RCSfile: itkImage.h,v $
  Language:  C++
  Date:      $Date: 2008/01/13 19:48:38 $
  Version:   $Revision: 1.142 $

  Copyright (c) Insight Software Consortium. All rights reserved.

  This software is distributed WITHOUT ANY WARRANTY; without even
  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  PURPOSE.  See the above copyright notices for more information.

=========================================================================*/

#include "igtlMultiThreader.h"
#include "igtlOSUtil.h"


typedef struct {
  int   nloop;
  igtl::MutexLock::Pointer glock;
} ThreadData;


void* ThreadFunction1(void* ptr)
{
  //------------------------------------------------------------
  // Get thread information
  igtl::MultiThreader::ThreadInfo* info = 
    static_cast<igtl::MultiThreader::ThreadInfo*>(ptr);

  int id      = info->ThreadID;
  int nThread = info->NumberOfThreads;
  ThreadData* data = static_cast<ThreadData*>(info->UserData);

  //------------------------------------------------------------
  // Get user data

  int nloop = data->nloop;
  igtl::MutexLock::Pointer glock = data->glock;

  long interval = 100; // (ms)

  //------------------------------------------------------------
  // Loop
  for (int i = 0; i < nloop; i ++)
    {
    glock->Lock();
    std::cerr << "Thread #1: counter = " << i << std::endl;
    glock->Unlock();
    igtl::Sleep(interval);
    }

  glock->Lock();
  std::cerr << "Thread #1: end." << std::endl;
  glock->Unlock();
  
  return NULL;
}


void* ThreadFunction2(void* ptr)
{
  //------------------------------------------------------------
  // Get thread information
  igtl::MultiThreader::ThreadInfo* info = 
    static_cast<igtl::MultiThreader::ThreadInfo*>(ptr);

  int id      = info->ThreadID;
  int nThread = info->NumberOfThreads;
  ThreadData* data = static_cast<ThreadData*>(info->UserData);

  //------------------------------------------------------------
  // Set user data
  int nloop = data->nloop;
  igtl::MutexLock::Pointer glock = data->glock;

  long interval = 200; // (ms)
  
  //------------------------------------------------------------
  // loop
  for (int i = 0; i < nloop; i ++)
    {
    glock->Lock();
    std::cerr << "Thread #2: counter = " << i << std::endl;
    glock->Unlock();
    igtl::Sleep(interval);
    }

  glock->Lock();
  std::cerr << "Thread #2: end." << std::endl;
  glock->Unlock();
  
  return NULL;
}


int main(int argc, char * argv [] )
{

  //------------------------------------------------------------
  // Set up thread and mutex cleasses
  igtl::MultiThreader::Pointer threader = igtl::MultiThreader::New();
  igtl::MutexLock::Pointer glock = igtl::MutexLock::New();

  //------------------------------------------------------------
  // Set up user data
  ThreadData td;
  td.nloop = 20;
  td.glock = glock;
  
  //------------------------------------------------------------
  // Set multiple methods as threads
  threader->SetNumberOfThreads(2);
  threader->SetMultipleMethod(0, (igtl::ThreadFunctionType) &ThreadFunction1, &td);
  threader->SetMultipleMethod(1, (igtl::ThreadFunctionType) &ThreadFunction2, &td);

  //------------------------------------------------------------
  // Start threads -- the main thread waits until all threads return.
  std::cerr << "Starting threads ...." << std::endl;
  threader->MultipleMethodExecute();
  std::cerr << "Theads stopped ...." << std::endl;

  return 0;
}