[Delphi] Переключение потоков между собой

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _PARAZIT_, 20 Dec 2009.

  1. Markus_13

    Markus_13 Member

    Joined:
    19 Feb 2009
    Messages:
    74
    Likes Received:
    19
    Reputations:
    0
    _PARAZIT_, сам незнаешь чего хочешь =\
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    делай 1 поток который из глобальной переменной будет брать букву которую писать.
    Нажал на одну кнопку, в эту переменную записалась нужная буква
    Нажал на другую кнопку, в ней записалась другая буква.
     
  3. _PARAZIT_

    _PARAZIT_ New Member

    Joined:
    2 Oct 2007
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    Спасибо всем ответившим.... доверимся опыту zeppe1in и сделаем как было написано выше, добавив небольшой класс управления потоками с реализацией необходимых методов добавления потоков и их переключения.
     
  4. zeppe1in

    zeppe1in Elder - Старейшина

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    если что, то я не виноват)
     
  5. _PARAZIT_

    _PARAZIT_ New Member

    Joined:
    2 Oct 2007
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    блин..... дополнительный вопросик возник: как правильно синхронизировать через критическую секцию? у меня к серверу несколько клиентов могут слать одновременно данные, и необходимо сформировать общий список, так сказать, и сихронизировать добавление данных в него с помощью критической секции...
     
  6. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,309
    Reputations:
    327
    далеко не лучший вариант, но просто тока что докодил в своих целях.

    Code:
    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);
    }
    
     
  7. _PARAZIT_

    _PARAZIT_ New Member

    Joined:
    2 Oct 2007
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    на сях не оч понятно.... :(
    вот мой код (что неправельно?):
    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.
     
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А вообще синхронизацию очень удобно делать не через критические секции, а через interlockexchenge. Работает очень быстро. Удобно применять в тех случаях когда период ожидания минимальный, но всё таки присутствует.