делай 1 поток который из глобальной переменной будет брать букву которую писать. Нажал на одну кнопку, в эту переменную записалась нужная буква Нажал на другую кнопку, в ней записалась другая буква.
Спасибо всем ответившим.... доверимся опыту zeppe1in и сделаем как было написано выше, добавив небольшой класс управления потоками с реализацией необходимых методов добавления потоков и их переключения.
блин..... дополнительный вопросик возник: как правильно синхронизировать через критическую секцию? у меня к серверу несколько клиентов могут слать одновременно данные, и необходимо сформировать общий список, так сказать, и сихронизировать добавление данных в него с помощью критической секции...
далеко не лучший вариант, но просто тока что докодил в своих целях. Code: DWORD g_last_time; CRITICAL_SECTION timesec; ////////////////////////////////////////////////////////////////////////// DWORD WINAPI TimeCheckThread(LPVOID lp) { while(TRUE){ EnterCriticalSection(×ec); if(GetTickCount()-g_last_time > 200){ // signal lost more than 200ms printf("SIGNAL LOST\r"); }else{ printf("SIGNAL GOOD\r"); } LeaveCriticalSection(×ec); Sleep(1); } return 0; } ////////////////////////////////////////////////////////////////////////// void CaptureLoop(SOCKET ssock) { char *pdata = (char*)malloc(65536); int isize = 0; DWORD tid; printf("waiting for broadcast signals...\n"); InitializeCriticalSection(×ec); g_last_time = GetTickCount(); CreateThread(0,0,TimeCheckThread,0,0,&tid); while(!_kbhit()){ isize = recvfrom(ssock, pdata, 65536, 0, 0, 0); if(isize > 0){ // analyse the packet PACKET *ppack = (PPACKET)pdata; if(ppack->iphdr.ip_protocol == IPPROTO_UDP) if(ppack->udphdr.dst_port == htons(33333)) if(memcmp((((LPBYTE)ppack)+sizeof(PACKET)), "BROADCAST_SIG", 13)==0){ EnterCriticalSection(×ec); g_last_time = GetTickCount(); LeaveCriticalSection(×ec); } } } free(pdata); }
на сях не оч понятно.... вот мой код (что неправельно?): Code: procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var TempStr:TStringList; Command:String; begin if not AThread.Terminated and AThread.Connection.Connected then begin TempStr:=TStringList.Create; Command:=AThread.Connection.ReadLn; try //memo1.Lines.Add(Command); try Section.Enter; Spisok.Add(Command); finally Section.Leave; end; //============================================================================== TempStr.Clear; TempStr.Add(IntToStr(Length(Command))); AThread.Connection.WriteStrings(TempStr); //============================================================================== Except AThread.Connection.Disconnect; end; TempStr.Free; end; end; критическая секция создается по FormCreate.
А вообще синхронизацию очень удобно делать не через критические секции, а через interlockexchenge. Работает очень быстро. Удобно применять в тех случаях когда период ожидания минимальный, но всё таки присутствует.