Помогите

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by seregahowe, 26 Sep 2014.

  1. seregahowe

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

    Joined:
    25 Jun 2011
    Messages:
    148
    Likes Received:
    36
    Reputations:
    15
    Всем спасибо. DEL
     
    #1 seregahowe, 26 Sep 2014
    Last edited: 26 Sep 2014
  2. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    у меня от дельфокодесов глаза друг друга на*** посылают, но рискну объяснить. очевидно что после создания рабочих потоков, основной выходит из цикла и соответственно выходит из функции, вызывая затем всякие деструкторы итд и в конце концов - ExitProcess. на чем процесс и завершается.

    поэтому нужно чтобы основной поток не выходил. или выходил например по нажатию горячей клавиши.

    первый вариант (школьный) - перед end еще один бесконечный цикл типа
    while(TRUE)
    {
    Sleep(1);
    }

    второй вариант - регистрируешь хоткей через RegisterHotKey
    и в цикле GetMessage читаешь сообщения из очереди, на WM_HOTKEY
    с заданной клавишей брякаешь цикл.

    а ну и самый элегантный - ждешь отработки всех потоков по средством WaitForMultipleObjects, которой передается поинтер на массив хендлов созданных тредов.
     
    #2 sn0w, 26 Sep 2014
    Last edited: 26 Sep 2014
    1 person likes this.
  3. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    627
    Likes Received:
    246
    Reputations:
    42
    Проблема в том, что у тебя MainThread завершает работу.
    PHP:
    type
      TMsgRecord 
    record
        thread 
    Integer;
        
    auth   Boolean;
        
    msg    string[15];
      
    end;

    var
      
    tArray:array [1..255of integer;
      
    tID:array [1..255of longword;
      
    tMSG:array [1..255of TMsgRecord;

    ThreadVar
      msgPtr 
    : ^TMsgRecord;

    function 
    MyFunction(Parameter Pointer) : Integer;
    begin
      Result 
    := 0;
      
    msgPtr := Parameter;
      ...
      
    CloseHandle(tArray[msgPtr.thread]);
      
    dec(tCount);
      
    EndThread(0);
    end;

    for 
    i:=1 to 255 do begin
    tMSG
    [i].thread := i;
    tMSG[i].auth   := false;
    tMSG[i].msg    := CMD+'.'+IntToStr(i);
    Inc(tCount);
    tArray[i]:=BeginThread(nil,0,Addr(myFunction),Addr(tMSG[i]),0,tID[i]);
    end;
    Вот и вся многопоточность. Зачем всякие конструкторы-деструкторы? Слишком много лишнего тащишь с собой, в итоге вес консольного приложения практически не будет отличаться от VCL'ного. Как по мне, нужно стараться избавляться от лишних модулей, оставляя разве что Windows и Winsock
     
    #3 #colorblind, 26 Sep 2014
    Last edited: 26 Sep 2014
    1 person likes this.