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

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

  1. _PARAZIT_

    _PARAZIT_ New Member

    Joined:
    2 Oct 2007
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    Товарищи подскажите как можно переключать патоки между собой: например есть паток T1 он в Memo все время пишет букву `A`, есть поток T2 он в Memo все время пишет букву `B`..... необходимо реализовать так что бы при нажатии на одну кнопку работал поток T1, а при нажатии на другую кнопку - T2..... как это сделать? необходимо ли уничтожать поток T1 перед созданием потока T2 или нет? создавать их когда, одновременно или как?
     
  2. 0ldbi4

    0ldbi4 Elder - Старейшина

    Joined:
    14 Apr 2008
    Messages:
    264
    Likes Received:
    51
    Reputations:
    10
    Ну потоковые проги не писал, но ядумаю что пускаешь T1 он выполняется отдаешь квант и не принимаешь его пока не выполнится второй, ну флаг какойнить замути)
     
  3. _PARAZIT_

    _PARAZIT_ New Member

    Joined:
    2 Oct 2007
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    у кого еще мысли есть?
     
  4. _s1r1us_

    _s1r1us_ New Member

    Joined:
    24 Aug 2009
    Messages:
    6
    Likes Received:
    2
    Reputations:
    0
    Попробуй реализовать это, и я думаю сам ответишь на свои вопросы=))
     
  5. _PARAZIT_

    _PARAZIT_ New Member

    Joined:
    2 Oct 2007
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    уже реализовано....... я просто думаю, по нажатию первой кнопки делать T1.Suspend T2.resume, а по второй кнопке наоборот, но это как то тупо..... может ктонибудь знает нормальный способ?
     
  6. _s1r1us_

    _s1r1us_ New Member

    Joined:
    24 Aug 2009
    Messages:
    6
    Likes Received:
    2
    Reputations:
    0
    ты каждый поток в ручную создаешь?(T1,T2,T3,...,Tn)? тупо ппц
     
  7. _PARAZIT_

    _PARAZIT_ New Member

    Joined:
    2 Oct 2007
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    их всего два или три......
    а как надо?
    и переключать все же их как?
     
  8. AquaKlaster

    AquaKlaster Active Member

    Joined:
    9 Mar 2009
    Messages:
    0
    Likes Received:
    204
    Reputations:
    23
    Согласен, циклом легче в n раз=)
     
  9. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    как то тупо - это довольно точная формулировка :D

    А можно поинтересоваться, зачем нужно "переключаться между пАтоками" ?
    Обычно пОтоки создаются для того, что бы они работали паралельно :)
     
  10. _PARAZIT_

    _PARAZIT_ New Member

    Joined:
    2 Oct 2007
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    ...задание такое.
    ну может ктонибудь по существу чтонибудь скажет?
     
  11. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Что бы кто-то что-то сказал по существу, нужно по существу задавать вопрос.
     
  12. _PARAZIT_

    _PARAZIT_ New Member

    Joined:
    2 Oct 2007
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    Code:
    unit TruncThread;
    
    interface
    
    uses Classes;
    
    type
    TTruncThread = class(TThread)
    private
    { Private declarations }
    Count_:integer;
    Update_Line:integer;
    protected
    procedure Execute; override;
    procedure UpdateCaption;
    end;
    
    implementation
    
    uses MainServ;
    
    procedure TTruncThread.UpdateCaption;
    begin
    Form1.Memo1.Lines.Add(Spisok[Update_Line]);
    end;
    
    procedure TTruncThread.Execute;
    var CurrentCount, i:integer;
        Temp_str:string;
    begin
    Count_:=1;
    while not(Terminated) do begin
      CurrentCount:=spisok.Count;
      if CurrentCount>Count_ then begin
        for i:=Count_ to CurrentCount do begin
          if length(Spisok.Strings[i-1])>80 then begin
            Temp_str:=Spisok.Strings[i-1];
            SetLength(Temp_str, 80);
            Spisok.Strings[i-1]:=Temp_str;
          end;
        Update_Line:=i-1;
        Synchronize(UpdateCaption);
        end;
        Count_:=CurrentCount;
      end;
    end;
    end;
    
    end.
    
    вот есть пОток, необходима написать еще один поток, что бы этот являлся ему предком, в нем нужно рализовать что бы Spisok.Strings был в верхнем регистре, и что бы была возможность переключать потоки в основной форме программы... ктонибудь поможет?
     
    #12 _PARAZIT_, 20 Dec 2009
    Last edited: 20 Dec 2009
  13. Markus_13

    Markus_13 Member

    Joined:
    19 Feb 2009
    Messages:
    74
    Likes Received:
    19
    Reputations:
    0
    нах это "чтобы этот являлся ему предком"???
    вот код переводит строки в Spisok.Strings в верхний регистр:
    Code:
    function strcUP(s:string):string;var r:string;k:byte;begin r:=s;for k:=1 to length(r)do begin
    if r[k]='a'then r[k]:='A';if r[k]='b'then r[k]:='B';if r[k]='c'then r[k]:='C';if r[k]='d'then r[k]:='D';
    if r[k]='e'then r[k]:='E';if r[k]='f'then r[k]:='F';if r[k]='g'then r[k]:='G';if r[k]='h'then r[k]:='H';
    if r[k]='i'then r[k]:='I';if r[k]='j'then r[k]:='J';if r[k]='k'then r[k]:='K';if r[k]='l'then r[k]:='L';
    if r[k]='m'then r[k]:='M';if r[k]='n'then r[k]:='N';if r[k]='o'then r[k]:='O';if r[k]='p'then r[k]:='P';
    if r[k]='q'then r[k]:='Q';if r[k]='r'then r[k]:='R';if r[k]='s'then r[k]:='S';if r[k]='t'then r[k]:='T';
    if r[k]='u'then r[k]:='U';if r[k]='v'then r[k]:='V';if r[k]='w'then r[k]:='W';if r[k]='x'then r[k]:='X';
    if r[k]='y'then r[k]:='Y';if r[k]='z'then r[k]:='Z';if r[k]='а'then r[k]:='А';if r[k]='б'then r[k]:='Б';
    if r[k]='в'then r[k]:='В';if r[k]='г'then r[k]:='Г';if r[k]='д'then r[k]:='Д';if r[k]='е'then r[k]:='Е';
    if r[k]='ё'then r[k]:='Ё';if r[k]='ж'then r[k]:='Ж';if r[k]='з'then r[k]:='З';if r[k]='и'then r[k]:='И';
    if r[k]='й'then r[k]:='Й';if r[k]='к'then r[k]:='К';if r[k]='л'then r[k]:='Л';if r[k]='м'then r[k]:='М';
    if r[k]='н'then r[k]:='Н';if r[k]='о'then r[k]:='О';if r[k]='п'then r[k]:='П';if r[k]='р'then r[k]:='Р';
    if r[k]='с'then r[k]:='С';if r[k]='т'then r[k]:='Т';if r[k]='у'then r[k]:='У';if r[k]='ф'then r[k]:='Ф';
    if r[k]='х'then r[k]:='Х';if r[k]='ц'then r[k]:='Ц';if r[k]='ч'then r[k]:='Ч';if r[k]='ш'then r[k]:='Ш';
    if r[k]='щ'then r[k]:='Щ';if r[k]='ъ'then r[k]:='Ъ';if r[k]='ы'then r[k]:='Ы';if r[k]='ь'then r[k]:='Ь';
    if r[k]='э'then r[k]:='Э';if r[k]='ю'then r[k]:='Ю';if r[k]='я'then r[k]:='Я';end;result:=r;end;
    
    procedure TTruncThread2.Execute;
    var CurrentCount, i:integer;
    begin
    while not(Terminated) do begin
    CurrentCount:=spisok.Count;
    for i:=0 to CurrentCount-1 do 
    Spisok.Strings[i]:=strcUP(Spisok.Strings[i]);
    end;
    end;
     
  14. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    StrToLower/Upper

    не понял, зачем такой код лопатить?!?! о_О

    Касательно потоков. Для чего они нужны? Для параллельной работы.

    И вот, почитай на досуге, про потоки http://forum.vingrad.ru/forum/topic-60076.html
     
  15. _PARAZIT_

    _PARAZIT_ New Member

    Joined:
    2 Oct 2007
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    как сделать верхний регистр я знаю.... и как наследовать я знаю.... не надо задавать вопросы на счет тупости, задание есть задание, я незадаю лишних вопросов.
    субственно суть вопроса - как переключать два потока между собой?
     
  16. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    шиздец, ссылку кому дал?

    скажи сразу, не хочу вкуривать, дайте тупо работающий код.
     
  17. intNet

    intNet Member

    Joined:
    31 May 2009
    Messages:
    29
    Likes Received:
    14
    Reputations:
    5
    Потоки могут работать независимо друг от друга.
    Создаёшь поток через CreateThread/BeginThread, ссылающийся на нужную тебе функцию, и никаких TThread не надо, да и работать всё будет стабильнее.
    Code:
    ...
    procedure Memo1Add();
    begin
      while true do
        Form1.Memo1.Lines.Append('a');
      ExitThread(0);
    end;
    
    procedure Memo2Add();
    begin
      while true do
        Form1.Memo2.Lines.Append('b');
      ExitThread(0);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      CloseHandle(CreateThread(nil, 0, @Memo1Add, nil, 0, dwThreadID));
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      CloseHandle(CreateThread(nil, 0, @Memo2Add, nil, 0, dwThreadID));
    end;
    
    end.
    
     
  18. _PARAZIT_

    _PARAZIT_ New Member

    Joined:
    2 Oct 2007
    Messages:
    29
    Likes Received:
    2
    Reputations:
    0
    intNet спосибо большое конечно, но тут к сожалению вопрос стоит остро и зависит он не от меня, так что реализация на WinAPI не пойдет.....
    а на счет вкуривания зря так издеваетесь:
    http://www.rsdn.ru/forum/delphi/3358361.flat.aspx
    http://forum.vingrad.ru/forum/topic-60076.html
    http://digs.alfaspace.net/topics/8
    http://www.delphisources.ru/pages/faq/base/threads_development.html
    http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1370
    ..................
    .....нужен ответ по теме, а не философия
     
  19. Pr0mo

    Pr0mo Member

    Joined:
    26 Nov 2009
    Messages:
    29
    Likes Received:
    31
    Reputations:
    4
    Вообще, на сколько я помню потокам можно задавать приоритеты. Соответсвенно, если у потока T1 приоритет 0, а у другого (T2) отличный от нуля, то процессорное время будет затрачиваться именно на поток T2.
     
  20. zeppe1in

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

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    Почему тупо? вроде самое то.