 |
|

21.12.2009, 02:39
|
|
Познающий
Регистрация: 19.02.2009
Сообщений: 83
С нами:
9065564
Репутация:
50
|
|
_PARAZIT_, сам незнаешь чего хочешь =\
|
|
|

21.12.2009, 10:31
|
|
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами:
10097606
Репутация:
3349
|
|
делай 1 поток который из глобальной переменной будет брать букву которую писать.
Нажал на одну кнопку, в эту переменную записалась нужная буква
Нажал на другую кнопку, в ней записалась другая буква.
|
|
|

21.12.2009, 14:36
|
|
Новичок
Регистрация: 02.10.2007
Сообщений: 29
С нами:
9793272
Репутация:
5
|
|
Спасибо всем ответившим.... доверимся опыту zeppe1in и сделаем как было написано выше, добавив небольшой класс управления потоками с реализацией необходимых методов добавления потоков и их переключения.
|
|
|

21.12.2009, 14:55
|
|
Постоянный
Регистрация: 12.07.2006
Сообщений: 327
С нами:
10437270
Репутация:
117
|
|
если что, то я не виноват)
|
|
|

24.12.2009, 01:14
|
|
Новичок
Регистрация: 02.10.2007
Сообщений: 29
С нами:
9793272
Репутация:
5
|
|
блин..... дополнительный вопросик возник: как правильно синхронизировать через критическую секцию? у меня к серверу несколько клиентов могут слать одновременно данные, и необходимо сформировать общий список, так сказать, и сихронизировать добавление данных в него с помощью критической секции...
|
|
|

24.12.2009, 19:45
|
|
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
С нами:
10943066
Репутация:
1236
|
|
далеко не лучший вариант, но просто тока что докодил в своих целях.
Код:
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);
}
__________________
 
snow white world wide
|
|
|

25.12.2009, 00:27
|
|
Новичок
Регистрация: 02.10.2007
Сообщений: 29
С нами:
9793272
Репутация:
5
|
|
на сях не оч понятно.... 
вот мой код (что неправельно?):
Код:
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.
|
|
|

25.12.2009, 10:33
|
|
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами:
10097606
Репутация:
3349
|
|
А вообще синхронизацию очень удобно делать не через критические секции, а через interlockexchenge. Работает очень быстро. Удобно применять в тех случаях когда период ожидания минимальный, но всё таки присутствует.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|