02 Aralık 2020, 14:51:11

Haberler:

Picproje Pazar Sohbetleri: https://bit.ly/2GHsjAK


Lazarus thread hatasi

Başlatan z, 31 Temmuz 2020, 18:05:24

z

Asagidaki thread uygulamasi Delphide calisiyor fakat Lazarusta Buton1'e basildiginda uygulama kapandi diye sistem mesaji cikiyor.


Sorun nedir?

unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsStdCtrls;

type

  TMsgRecord 
record
    Cmd    
Integer;
    
msg    string[30];
  
end;

  
TForm1 = class(TForm)
    
Button1TButton;
    
Button2TButton;
    
Label1TLabel;
    
Label2TLabel;
    
procedure Button1Click(SenderTObject);
    
procedure Button2Click(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;
  
id1LongWord;
  
thread1 Integer;
  
msg1 TMsgRecord;
  
FlagBoolean;

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

ThreadVar         // We must allow each thread its own instances
msgPtr : ^TMsgRecord;

// Private thread procedure to show a string


function BenimThread(Parameter Pointer):boolean;
var 
i:integer;
begin
        i
:=0;
        
msgPtr := Parameter;
        
form1.Label1.Caption:='Thread Basladi: '+IntToStr(msgPtr.Cmd);
        while 
Flag do i:=i+1;
        
CloseHandle(thread1);
        
form1.Label2.Caption:='Thread Bitti i='+inttostr(i);
end;

procedure TForm1.Button1Click(SenderTObject);
begin
        msg1
.Cmd := $FFFF;
        
msg1.msg    := 'Hello World';

        
Flag:=true;
        
thread1 := BeginThread(nil0Addr(BenimThread), Addr(msg1), 0id1);
end;

procedure TForm1.Button2Click(SenderTObject);
var 
i:integer;
begin
        Flag
:=false;
end;

end.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com  https://www.facebook.com/pages/Cnc-Designer/337826782908966

ercan_t


treadler temel olarak böyle kullanılmaz criticalsection kullanman lazım.

Eğer thread içinde bir değişkeni thread dışında kullanırsan access violation at address hatasını alırsın.(genel olarak)
thread konusunda değikeni değiştirirken thread lock ve unlock konularını incelemeni tavsiye ederim.





z

Bu sekilde herseyi degiskenleri devre disi biraksam da program duruyor.

function BenimThread(a:integer):boolean;
var 
i:integer;
begin
        
//i:=0;
        //msgPtr := Parameter;
        //form1.Label1.Caption:='Thread Basladi: '+IntToStr(msgPtr.Cmd);
        //while Flag do i:=i+1;
        
FileClose(thread1);
        
//form1.Label2.Caption:='Thread Bitti i='+inttostr(i);
end;

procedure TForm1.Button1Click(SenderTObject);
begin
        msg1
.Cmd := $FFFF;
        
Flag:=true;
        
thread1 := BeginThread(nil0Addr(BenimThread), Addr(msg1), 0id1);
end;   
Bana e^st de diyebilirsiniz.   www.cncdesigner.com  https://www.facebook.com/pages/Cnc-Designer/337826782908966

ercan_t

bak orada yine tread1 kullanmışsın oda genel bir değişken

FileClose(thread1); yerine EndThread(0);

kullanmalısın.

z

Delphide veri hazir/hazir degil anlaminda sadece bir tane byte tipi flag kullanarak ana programdan bufferi doldurup thread tarafinda bufferi okuyarak sorunsuz pek cok program yazdim.

Hic sorun yasamadim.

Daha baska bir sorun var.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com  https://www.facebook.com/pages/Cnc-Designer/337826782908966

Kılıç

03 Ağustos 2020, 11:18:09 #5 Son düzenlenme: 03 Ağustos 2020, 11:20:03 Kılıç
Flag, Buffer vb. yazma silme esnasında çakışma olmaması için waitforsingleobject doğru şekilde kullanılmalıdır. Sadece kullanmak yetmez.

Bir bilgisayarda sorunsuz, diğerinde az sorunlu, öbüründe tam sorunlu olabilir. Yapılan işlerin zamanlarının denk gelmesiyle sorun çözülmüş gibi avunulabilir. Sorun 6 saat sonra çıkabilir
auto-reverse recording

z

1 byte lik alan isgal eden flag kullanilmasi durumunda nasil bir cakisma olabilir?

Bir senaryo yazabilirmisin?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com  https://www.facebook.com/pages/Cnc-Designer/337826782908966

z

Alıntı yapılan: ercan_t - 03 Ağustos 2020, 00:42:09bak orada yine tread1 kullanmışsın oda genel bir değişken

FileClose(thread1); yerine EndThread(0);

kullanmalısın.

Ne alaka?

Thread1 denilen handler degeri ramda duran ve olusturlduktan sonra hic kimsenin icerigiyle oynamadigi bir degisken.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com  https://www.facebook.com/pages/Cnc-Designer/337826782908966