2011-03-08 19 views
12

Birisi, Delphi 2010 için en basit iş parçacığı örneğini yayınlayabilir mi, örneğin düğme tıklatıldığında bir metne bazı metni koyar mı? Uygulaması ve hepsi ile. Teşekkürler.Delphi 2010 konuları

Güncelleme: Tamam, sadece bir şey yapan basit bir iş parçacığı. Not gerektirmez. Teşekkürler.

+5

Neden niçin bir notta metin koymak için bir iş parçacığı istersiniz? Aslında bu, akla gelebilecek en kötü örnekle ilgilidir, çünkü UI kodunun ana iş parçasında çalışması gerekir. –

+4

@David - durumu kullanıcıya bildirme gibi şeyler için yararlıdır. Yani bir iş parçacığı, diski, kötü amaçlı yazılım için arar. Ana iş parçacığına geri dönüş, "vurur" vb. Senkronize etmek için muhtemelen bunu yapmak gerekir. –

+2

@Chris Oldukça ağır olan 'Synchronize'den kaçınmam ve problemi farklı çözme eğilimindeyim. –

cevap

13

Delphi ile birlikte gelen GUI/Synchronize dahil olmak üzere güzel bir iş parçacığı demosu var. D2005'de: C: \ Program Files \ Borland \ BDS \ 3.0 \ Demos \ DelphiWin32 \ VCLWin32 \ Threads

2

Belirtildiği gibi, GUI'yi güncelleştirmek için bir iş parçacığı oluşturmak iyi bir tasarım değil . Konularınızın gerçek bir iş yapmasını sağlamak ve ana iş parçasının ekranınızı güncellemesine izin vermek daha iyi olur.

Delphi ayrıca, iş parçacığı oluşturmayı/yönetmeyi kolaylaştırmak için TThread sınıfını sunarken, aynı zamanda basit iş parçacıklarını yürütmek için Delphi'nin BeginThread işlevini kullanmayı da isteyebilirsiniz.

// Full Unit code. 
// ----------------------------------------------------------- 
// You must store this code in a unit called Unit1 with a form 
// called Form1 that has an OnCreate event called FormCreate. 

unit Unit1; 

interface 

uses 
    Forms, Dialogs, Windows, SysUtils; 

type 
    TMsgRecord = record 
    thread : Integer; 
    msg : string[30]; 
    end; 
    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    end; 

var 
    Form1: TForm1; 

Implementation 
{$R *.dfm}  // Include form definitions 

ThreadVar   // We must allow each thread its own instances 
        // of the passed record variable 
    msgPtr : ^TMsgRecord; 

// Private thread procedure to show a string 
function ShowMsg(Parameter : Pointer) : Integer; 
begin 
    // Set up a 0 return value 
    Result := 0; 

    // Map the pointer to the passed data 
    // Note that each thread has a separate copy of msgPtr 
    msgPtr := Parameter; 

    // Display this message 
    ShowMessagePos('Thread '+IntToStr(msgPtr.thread)+' '+msgPtr.msg, 
       200*msgPtr.thread, 100); 

    // End the thread 
    EndThread(0); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    id1, id2 : LongWord; 
    thread1, thread2 : Integer; 
    msg1, msg2 : TMsgRecord; 

begin 
    // set up our display messages 
    msg1.thread := 1; 
    msg1.msg := 'Hello World'; 
    msg2.thread := 2; 
    msg2.msg := 'Goodbye World'; 

    // Start the first thread running asking for users first name 
    thread1 := BeginThread(nil, 
         0, 
         Addr(ShowMsg), 
         Addr(msg1), 
         0, 
         id1); 

    // And also ask for the surname 
    thread2 := BeginThread(nil, 
         0, 
         Addr(ShowMsg), 
         Addr(msg2), 
         0, 
         id2); 

    // Ensure that the threads are only closed when all done 
    ShowMessagePos('Press this when other dialogs finished.', 200, 300); 

    // Finally, tidy up by closing the threads 
    CloseHandle(thread1); 
    CloseHandle(thread2); 
end; 

end. 

Burada da parametreler (BeginThread kullanarak) ile konuları nasıl kullanılacağına dair another example: Ben burada yeniden üretmiş bir example on the Delphi Basics web sitesi bulunmaktadır. Tahmin edebiliyorum

+0

Teşekkürler, lütfen TThread sınıfını kullanarak basit bir örnek gönderir misiniz? –

+0

Örnek kodun bu gibi sorunlu bir kod içermesi gerektiğini düşünmüyorum (VCL GUI kodunu ikincil iş parçacıkları bağlamında yürütmek). – mghie

+0

@mghie - Yazmayı dikkate almadım, ancak bunun yerine yorumumu kötü bir tasarım olarak nitelendirdim. Onları sorundan haberdar ettikten sonra iyi/kötü tasarım kararları vermek isteyip istemediklerini karar vermek için başkalarına bırakacağım. – Mick

11

En basit örnek: Ben tavsiye kullanmadığınız olsa da bazı dezavantajlara sahiptir, çünkü

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    TThread.CreateAnonymousThread(procedure 
     var 
     slThread: TStringList; 
     i: Integer; 
     begin 
      //do something in thread 
      slThread := TStringList.Create; 
      try 
      for i := 0 to 100 - 1 do 
      begin 
       slThread.Add(Format('Value %D',[i])); 
      end; 

      //update gui 
      TThread.Synchronize(nil, procedure 
      begin 
       Form1.Memo1.Lines.AddStrings(slThread); 
      end); 


      finally 
      slThread.Free; 
      end; 


     end).Start; 
end; 

(Eğer Form1'üzerinde Memo1 olduğunu varsayalım). Kendi TThread sınıfınızı inmek daha iyidir ama sorunuz için bu örnek güzel bir şekilde uyuyor.

+0

+1. –

+0

'nil,' 'TThread.Synchronize '' (burada gerekli mi? (Ben öyle düşünmüyorum) – mjn

+0

Bu, TThread'in örnek parametresidir. Bu örnekte bildirmediğimiz için, nil'den geçmemiz gerekiyor. – Linas