lt; 5; i ++)
{[i]=NULL;
}
}
//створення іменованого каналу для спілкування з клієнтом
//--------------------------------------------------------------------------- ConnectShooters (LPVOID lpvParam)
{Number=0; (Number lt; 5)
{fConnected;=CreateNamedPipe (lpszPipename, _ACCESS_DUPLEX, _TYPE_MESSAGE | _READMODE_MESSAGE | _WAIT, _UNLIMITED_INSTANCES ,,,
, NULL);=ConnectNamedPipe (hPipe, NULL); (fConnected)
{[Number]=hPipe;
//створення потоку для роботи з клієнтом
hThread=CreateThread (NULL,
, (LPTHREAD_START_ROUTINE) ShooterThread,
(LPVOID) Number,
, NULL); ++;
} (hPipe);
}
}
//потік для роботи з клієнтом
//---------------------------------------------------------------------------
void ShooterThread (LPVOID lpvParam)
{chBuf [BUFSIZE]; cbRead, cbWritten; fSuccess; n=(int) lpvParam; (1)
{
//зчитування відповідей клієнта з каналу=ReadFile (hProcPipe [n],
chBuf ,,
amp; cbRead,); (fSuccess)
{result=atoi (chBuf); (result)
{
//у разі відповіді клієнта 1 йде прямий рахунок
case (1): ++; - gt; StringGrid1- gt; Cells [0] [Count - 1]=IntToStr (Count) + -й raquo ;;
break;
//у разі відповіді клієнта 2 йде зворотний рахунок
case (2): - gt; StringGrid1- gt; Cells [1] [Count - 1]=IntToStr (Count) + -й команду прийняв raquo ;;
Count -;
//при закінченні зворотного рахунку виробляємо постріл
if (Count == 0) Shoot () ;;: break;
}
} break;
} (hProcPipe [n]); [n]=NULL;
}
//вистрелShoot ()
{(int i=1; i lt;=5; i ++) - gt; StringGrid1- gt; Cells [2] [i - 1]= Постріл raquo ;; - gt; Button1- gt; Enabled=true;
} __ fastcall TForm1 :: Button1Click (TObject * Sender)
{StartupInfo; _INFORMATION ProcessInfo; - gt; Button1- gt; Enabled=false;=CreateThread (NULL,
, (LPTHREAD_START_ROUTINE) ConnectShooters,
(LPVOID) 0,0, NULL); (hThread == NULL) {PrintInfo ( Помилка при створенні потоку ); return; }
//для кожного стрільця створюємо процес
for (int i=0; i lt; 5; i ++)
{( amp; StartupInfo, sizeof (StartupInfo)) ;. cb=sizeof (StartupInfo) ;. dwFlags=STARTF_USESHOWWINDOW ;. wShowWindow=SW_HIDE;
//параметр командного рядка, що визначає черговість рахунки
// стрільців-клієнтів ShooterSleep=(i + 1) * 1000; CommandLine= raquo ;;= Shooter + IntToStr (i) + + IntToStr (ShooterSleep); (! (NULL ,. c_str (),//Покажчик на рядок,
//визначальну командний рядок для виконання,
NULL ,,
, NULL, (). c_str (),//ім'я поточного каталогу
amp; StartupInfo,//інформація передустановки
amp; ProcessInfo))//інформація про процес
{PrintInfo ( Не можу створити процес ); return; }
hProcPipe [i]=ProcessInfo. hProcess;
}
//створюємо семафор Рахунок =CreateSemaphore (NULL,//Адреса структури TSecurityAttributes
SemaphoreMax,//початкове значення лічильника,//максимальне значення
//лічильника
SemaphoreCount );// Ім'я об'єкта
}
//---------------------------------------------------------------------------
Програма-клієнт ( Стрілок )
//---------------------------------------------------------------------------
# include lt; vcl. h gt;
# include lt; iostream. h gt;
# define BUFSIZE 512
# define N 5
# pragma hdrstop
//---------------------------------------------------------------------------
# pra...