[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. arnis

    arnis Member

    Joined:
    30 Jan 2011
    Messages:
    280
    Likes Received:
    23
    Reputations:
    0
    Попробуй поставить слип не большой во время выполнения потока.
     
  2. GlooK

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

    Joined:
    20 Apr 2007
    Messages:
    172
    Likes Received:
    53
    Reputations:
    10
    PHP:
    procedure TForm1.Button1Click(SenderTObject);
    var
      
    i:integer;
      
    Threads: array of MultiThread;
    begin
    Work
    :=true;
    Acc:=-1;
    CurAcc:=0;
    SetLength(ThreadsEdit1.Text);
    for 
    := 0 to StrToInt(Edit1.Text) - do
    begin
        Threads
    [i] := MultiThread.Create(true);
        
    Threads[i].FreeOnTerminate := True;
        
    Threads[i].Resume;
    end;
    end;
     
  3. Jed7777

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

    Joined:
    16 Jun 2008
    Messages:
    0
    Likes Received:
    11
    Reputations:
    0
    Не помогает, так кажется как будто только последний поток работает, остальные пробегают мимо...

    Все работает точно также...
     
  4. arnis

    arnis Member

    Joined:
    30 Jan 2011
    Messages:
    280
    Likes Received:
    23
    Reputations:
    0
    а где у вас обьявлена переменная Work ???
    у вас перывй раз перменная становится фалсе, и все
     
  5. Jed7777

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

    Joined:
    16 Jun 2008
    Messages:
    0
    Likes Received:
    11
    Reputations:
    0
    При клике значение true, потом условие
    PHP:
      if Acc<Form1.Memo1.Lines.Count then CurAcc:=Acc else Work:=false;
    Становиться false только тогда когда закончатся строчки из Memo1.
     
  6. arnis

    arnis Member

    Joined:
    30 Jan 2011
    Messages:
    280
    Likes Received:
    23
    Reputations:
    0
    переписывайте все.
    в поток выносите только то что требуется. а проверки и весь мусор в основной код.

    да и логирование пусть и элементарное очень вам поможет в будущем.
     
  7. Jed7777

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

    Joined:
    16 Jun 2008
    Messages:
    0
    Likes Received:
    11
    Reputations:
    0
    Что я только не пробовал делать... Такой способ тоже делал..
     
  8. sidapas23

    sidapas23 New Member

    Joined:
    13 Nov 2010
    Messages:
    88
    Likes Received:
    2
    Reputations:
    -3
    как сделать чтобы в этом код1 вместо Text.txt было имя только что созданного текстового файла кодом 2
    код1
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
    // открываем блокнот
    ShellExecute(Handle, 'open', 'notepad.exe', nil, nil, SW_RESTORE);
    sleep(500);// маленько тормознем
    h:= FindWindow('Notepad',nil);// находим дескриптор блокнота
    h1:= FindwindowEx(h, 0, 'Edit', nil);// находим дескриптор поля ввода блокнота - Edit
    if h1 <> 0 then // если найден дескриптор
    begin
    AssignFile(f, 'Text.txt'); // открываем файл с текстом
    Reset(f);
    Timer1.Interval:= StrtoInt(Edit1.Text);
    Timer1.Enabled:= True;//- врубаем таймер
    end;

    end;

    Sidapas (21:15:56 27/02/2011)
    код2procedure TForm1.Button1Click(Sender: TObject);
    var
    myDate : TDateTime;
    myYear, myMonth, myDay : Word;
    myHour, myMin, mySec, myMilli : Word;
    begin
    myDate := now;
    DecodeDateTime(myDate, myYear, myMonth, myDay,
    myHour, myMin, mySec, myMilli);
    Memo1.Lines.SaveToFile(IntToStr(myYear)+'_'+IntToStr(myMonth)+
    '_'+IntToStr(myDay)+'_'+IntToStr(myHour)+'_'+IntToStr(myMin)+'_'+IntToStr(mySec)+'.txt');
    end;
     
  9. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    sidapas23, не проще так сделать? О_о
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    begin  
      Memo1.Lines.SaveToFile(FormatDateTime('yyyy_mm_dd_hh_nn_ss', Now) + '.txt');
    end;
    
     
  10. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10

    Ну наверное просто переменные надо поставить в другое место :)


    А именно эти:


    "
    myDate : TDateTime;
    myYear, myMonth, myDay : Word;
    myHour, myMin, mySec, myMilli : Word;
    "
     
  11. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    Code:
    type
      TMyThread = class (TThread)
      private
        FParam: integer;  
        FOnDone: TNotifiEvent; //создадим собитие
      protected
        procedure Execute; override;
      public
        Constructor Create(const Param:integer);  //overload; //не помню нада ли...
        property Param:integer read FParam write FParam;
        property OnDone:TNotifiEvent read FOnDone write FOnDone;
      end;
    
    [B]implementation[/B]
    
    constructor TMyThread. Create(const Param:integer);
    begin
      inherited Create(false);
      FParam:=Param;
      FreeOnTerminated:=true;
    end;
    
    procedure TMyThread.Execute;
    var
      IdHttp:TIdHttp;
    begin
      IdHttp:=TidHttp.Create;
      try
        //...
        //use idhttp
        //...
      finally
        IdHttp.Free;
        If Assigned(FOnDone)  then //наше собитие (можно использовать для возрата инфи)
          Synhronize(FOnDone(Self));
      end;
    end;
    
    procedure MyProcForCreateThread;
    var
      MyThread:TMуThread;
    begin
      with TMyThread.Create(true) do //так
      begin                                         //true - создань и усепить
        Param:=54;
        OnDone:=MyOnDoneProc;
        Start;                                      
      end;
    
      with TMyThread.Create(54)  do//или так
        OnDone:=MyOnDoneProc;
    
      //или так
      MyThread:=TMyThread.Create(true);
      MyThread.Param:=54;
      MyThread.OnDone:=MyOnDoneProc;
      MyThread.Start;
    end;  
    
    procedure MyOnDoneProc(Sender:TObject);
    begin
      Dec(ThreadCount); //собития можно использовать для контроля количества потоков
      ShowMessage(IntToStr(TMyThread(Sender).Param)); //или для возрата параметров  
    end; 
    
    ясн?)
     
    #7871 ADR-007, 28 Feb 2011
    Last edited: 28 Feb 2011
  12. Helium

    Helium New Member

    Joined:
    6 Jan 2010
    Messages:
    22
    Likes Received:
    3
    Reputations:
    0
    Разобрался
     
    #7872 Helium, 28 Feb 2011
    Last edited: 7 Apr 2011
  13. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10
    Убрать строку

    Code:
    {$APPTYPE CONSOLE}
     
  14. Helium

    Helium New Member

    Joined:
    6 Jan 2010
    Messages:
    22
    Likes Received:
    3
    Reputations:
    0
    Разобрался
     
    #7874 Helium, 28 Feb 2011
    Last edited: 7 Apr 2011
  15. Helium

    Helium New Member

    Joined:
    6 Jan 2010
    Messages:
    22
    Likes Received:
    3
    Reputations:
    0
    Разобрался
     
    #7875 Helium, 28 Feb 2011
    Last edited: 7 Apr 2011
  16. dos999

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

    Joined:
    15 Feb 2008
    Messages:
    137
    Likes Received:
    24
    Reputations:
    0
    попробуй
    Code:
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run',true);
    Reg.WriteString('lolo','C:\e.exe');
    Reg.CloseKey;
    Reg.Free;
     
  17. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Helium, вот тебе пример записи разных данных в реестр:
    Code:
    procedure RegWrite;
    var
      reg: TRegistry;
      Bin: array[0..10] of Byte;
      I: Integer;
    begin
      for i:= 0 to High(Bin) do Bin[i]:= i;
    
      reg:= TRegistry.Create(KEY_ALL_ACCESS);
      with Reg do
      try
        RootKey:= HKEY_CURRENT_USER;
        OpenKey('Software\my_sub_key', True);
        WriteInteger('Integer', I);
        WriteDate('Date', Now);
        WriteBinaryData('BinData', Bin, SizeOf(Bin));
        WriteString('String', 'String');
        WriteBool('Bool',True);
        Reg.WriteFloat('Float',2.366);
        CloseKey;
      finally
        Free;
      end;
    end;
     
  18. Helium

    Helium New Member

    Joined:
    6 Jan 2010
    Messages:
    22
    Likes Received:
    3
    Reputations:
    0
    Разобрался
     
    #7878 Helium, 28 Feb 2011
    Last edited: 7 Apr 2011
  19. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    ну а кто Reg будет инициализировать, бабушка из соседнего подъезда?
    Code:
    reg:= TRegistry.Create(KEY_ALL_ACCESS);
    
     
  20. Helium

    Helium New Member

    Joined:
    6 Jan 2010
    Messages:
    22
    Likes Received:
    3
    Reputations:
    0
    Ошибки нет, но в итоге в реестре так же пусто.
     
Thread Status:
Not open for further replies.