HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #21  
Старый 21.12.2009, 02:39
Markus_13
Познающий
Регистрация: 19.02.2009
Сообщений: 83
С нами: 9065564

Репутация: 50
По умолчанию

_PARAZIT_, сам незнаешь чего хочешь =\
 
Ответить с цитированием

  #22  
Старый 21.12.2009, 10:31
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

делай 1 поток который из глобальной переменной будет брать букву которую писать.
Нажал на одну кнопку, в эту переменную записалась нужная буква
Нажал на другую кнопку, в ней записалась другая буква.
 
Ответить с цитированием

  #23  
Старый 21.12.2009, 14:36
_PARAZIT_
Новичок
Регистрация: 02.10.2007
Сообщений: 29
С нами: 9793272

Репутация: 5
По умолчанию

Спасибо всем ответившим.... доверимся опыту zeppe1in и сделаем как было написано выше, добавив небольшой класс управления потоками с реализацией необходимых методов добавления потоков и их переключения.
 
Ответить с цитированием

  #24  
Старый 21.12.2009, 14:55
zeppe1in
Постоянный
Регистрация: 12.07.2006
Сообщений: 327
С нами: 10437270

Репутация: 117
По умолчанию

если что, то я не виноват)
 
Ответить с цитированием

  #25  
Старый 24.12.2009, 01:14
_PARAZIT_
Новичок
Регистрация: 02.10.2007
Сообщений: 29
С нами: 9793272

Репутация: 5
По умолчанию

блин..... дополнительный вопросик возник: как правильно синхронизировать через критическую секцию? у меня к серверу несколько клиентов могут слать одновременно данные, и необходимо сформировать общий список, так сказать, и сихронизировать добавление данных в него с помощью критической секции...
 
Ответить с цитированием

  #26  
Старый 24.12.2009, 19:45
sn0w
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
С нами: 10943066

Репутация: 1236


По умолчанию

далеко не лучший вариант, но просто тока что докодил в своих целях.

Код:
DWORD g_last_time;
CRITICAL_SECTION timesec;
//////////////////////////////////////////////////////////////////////////
DWORD WINAPI TimeCheckThread(LPVOID lp)
{

	while(TRUE){
		EnterCriticalSection(&timesec);
		if(GetTickCount()-g_last_time > 200){ // signal lost more than 200ms
			printf("SIGNAL LOST\r");
		}else{
			printf("SIGNAL GOOD\r");
		}
		LeaveCriticalSection(&timesec);
		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(&timesec);

	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(&timesec);
						g_last_time = GetTickCount();
						LeaveCriticalSection(&timesec);
					}
				
		}

	}

	free(pdata);
}
__________________


snow white world wide
 
Ответить с цитированием

  #27  
Старый 25.12.2009, 00:27
_PARAZIT_
Новичок
Регистрация: 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.
 
Ответить с цитированием

  #28  
Старый 25.12.2009, 10:33
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

А вообще синхронизацию очень удобно делать не через критические секции, а через interlockexchenge. Работает очень быстро. Удобно применять в тех случаях когда период ожидания минимальный, но всё таки присутствует.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Delphi] Задержка в WinSock между send() и recv() GlooK С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby 9 29.09.2009 18:26



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.