| 1321 | } |
| 1322 | |
| 1323 | void Receive(bool wait = false) |
| 1324 | { |
| 1325 | int msg = -1; |
| 1326 | int sender(0); |
| 1327 | |
| 1328 | #ifdef DEBUGTRACE |
| 1329 | // this->StartTimer(); |
| 1330 | #endif |
| 1331 | if (ReceiveBuffer && wait) |
| 1332 | { |
| 1333 | ReceiveBuffer->GetRequest().Wait(); |
| 1334 | } |
| 1335 | |
| 1336 | if (ReceiveBuffer && ReceiveBuffer->GetRequest().Test()) |
| 1337 | { |
| 1338 | MyStream& inStream(ReceiveBuffer->GetStream()); |
| 1339 | inStream >> msg >> sender; |
| 1340 | this->Msgs.push_back((Message)msg); |
| 1341 | if (msg == NewTask) |
| 1342 | { |
| 1343 | PRINT("Received message " << msg << " from " << sender) |
| 1344 | |
| 1345 | vtkSmartPointer<Task> task = this->NewTaskInstance(); |
| 1346 | this->Read(inStream, *task); |
| 1347 | PRINT("Received task " |
| 1348 | << task->GetId()); //<<" "<<task->Seed[0]<<" "<<task->Seed[1]<<" "<<task->Seed[2]); |
| 1349 | this->NTasks.push_back(task); |
| 1350 | } |
| 1351 | delete ReceiveBuffer; |
| 1352 | ReceiveBuffer = nullptr; |
| 1353 | } |
| 1354 | if (ReceiveBuffer == nullptr) |
| 1355 | { |
| 1356 | ReceiveBuffer = new MessageBuffer(this->MessageSize); |
| 1357 | MyStream& inStream(ReceiveBuffer->GetStream()); |
| 1358 | this->Controller->NoBlockReceive(inStream.GetRawData(), inStream.GetSize(), |
| 1359 | vtkMultiProcessController::ANY_SOURCE, 561, ReceiveBuffer->GetRequest()); |
| 1360 | } |
| 1361 | |
| 1362 | #ifdef DEBUGTRACE |
| 1363 | // double time = this->StopTimer(); |
| 1364 | // if (msg >= 0) |
| 1365 | // { |
| 1366 | // this->ReceiveTime += time; |
| 1367 | // } |
| 1368 | #endif |
| 1369 | } |
| 1370 | |
| 1371 | int NumSends; |
| 1372 | double ReceiveTime; |