Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread anhalten (https://www.delphipraxis.net/74607-thread-anhalten.html)

Florian_Meyer 6. Aug 2006 08:50


Thread anhalten
 
Hallo,
ich habe meine Hauptform, auf die wird etwas per Thread synchronisiert geschrieben. Nun möchte ich aber in einem zweiten Fenster den anderen Thread kurz analten: per Thread.Suspend;
Allerdings klappt das leider nicht ganz so, wie ich mir das vorgestellt habe, denn ich bekomme eine AV.

Kann mir jemand sagen, was ich falsch mache?

Delphi-Quellcode:
procedure TnewUpload.FormShow(Sender: TObject);
begin
  Thread2.Suspended;
end;
Delphi-Quellcode:
procedure TnewUpload.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Thread2.Resume;
end;

MfG
F.M.

xaromz 6. Aug 2006 08:52

Re: Thread anhalten
 
Hallo,

der Code, den Du zeigst, ist erstmal richtig. Leider zeigt er aber nicht das Problem.
Wo genau tritt denn die AV auf? Wie lautet die genaue Fehlermeldung? Zeig mal etwas mehr Code.

Gruß
xaromz

Florian_Meyer 6. Aug 2006 09:04

Re: Thread anhalten
 
Ok, also der Fehler tritt auf, wenn ich das Fenster mit ShowModal; aufrufe.

Delphi-Quellcode:
procedure TnewUpload.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Thread2.Resume;
end;

procedure TnewUpload.FormShow(Sender: TObject);
begin
  Thread2.Suspend;
end;

procedure TnewUpload.SaveUpload;
begin
  if eServer.Text = '' then
    MessageBox(0,'Bitte geben Sie einen Server ein!','Server eingeben',MB_OK + MB_ICONSTOP)
  else if ePort.Text = '' then
       MessageBox(0,'Bitte geben Sie einen Port ein!','Port eingeben',MB_OK + MB_ICONSTOP)
    else if eUser.Text = '' then
         MessageBox(0,'Bitte geben Sie einen Benutzernamen ein!','Benutzername eingeben',MB_OK + MB_ICONSTOP)
      else if ePassword.Text = '' then
           MessageBox(0,'Bitte geben Sie ein Passwort ein!','Passwort eingeben',MB_OK + MB_ICONSTOP)
        else if eQPath.Text = '' then
            MessageBox(0,'Bitte geben Sie einen Quellpfad ein!','Quellpfad eingeben',MB_OK + MB_ICONSTOP)
          else if eSPath.Text = '' then
               MessageBox(0,'Bitte geben Sie einen Serverpfad ein!','Serverpfad eingeben',MB_OK + MB_ICONSTOP)
            else if eIntervall.Text = '' then
                 MessageBox(0,'Bitte geben Sie ein Intervall ein!','Intervall eingeben',MB_OK + MB_ICONSTOP)
              else if eIntervall.Text < '60' then
                   MessageBox(0,'Das Intervall muss mindestens 60 Sekunden betragen!','Intervall zu klein',MB_OK + MB_ICONSTOP)
                else
                begin
                  MainForm.ABSDatabase1.Connected := true;
                  MainForm.UploadTable.Active := true;
                  with MainForm.UploadTable do
                  begin
                    Insert;
                    FieldByName('sServer').AsString := eServer.Text;
                    FieldByName('iPort').AsString := ePort.Text;
                    FieldByName('sUser').AsString := eUser.Text;
                    FieldByName('sPassword').AsString := ePassword.Text;
                    FieldByName('sQPath').AsString := eQPath.Text;
                    FieldByName('sSPath').AsString := eSPath.Text;
                    FieldByName('iIntervall').AsString := eIntervall.Text;
                    FieldByName('lAuto').AsVariant := cbAuto.Checked;
                    Post;
                  end;
                  ClearForm;
                  MainForm.UpdateUploads;
                  MainForm.UploadTable.Active := false;
                  MainForm.ABSDatabase1.Connected := false;
                  Close;
              end;
end;

procedure TnewUpload.bSaveClick(Sender: TObject);
begin
  SaveUpload;
end;

Dort rufe ich ja dann
Delphi-Quellcode:
procedure TnewUpload.FormShow(Sender: TObject);
begin
  Thread2.Suspend;
end;
auf und dort bekomme ich die Zugriffsverletzung.

Wenn ich
Thread2.Suspend;
über einen Button im MainForm aufrufe, dann bekomme ich keinen Fehler.

MfG

xaromz 6. Aug 2006 10:18

Re: Thread anhalten
 
Hallo,

wo ist denn Thread2 deklariert? Hast Du vielleicht in Deinem zweiten Form einen Thread gleichen Namens, der nicht initialisiert wurde?
Setz mal einen Breakpoint und gehe dann mit Einzelschritten durch, bis Du zu der Anweisung kommst, die den Fehler verursacht.

Gruß
xaromz

Florian_Meyer 6. Aug 2006 11:02

Re: Thread anhalten
 
Hallo,

also danke für deine Bemühungen, aber ich hab das im Programm jetzt anders gelöst, so dass ich den Thread dort nicht mehr unterbrechen muss, aber trotzdem danke!

MfG
Florian Meyer


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz