ďťż

Ładny brzuch

Chodzi o Delphi.
Co może oznaczać błąd (generowany przez wątek przy zamykaniu aplikacji):

Exception EOSError in module MojProgram.exe at 0000E0BE.
System Error. Code 1400.
Nieprawidłowe dojście okna.

W procedurze wątku mam kilka pętli i obsługa Gauge, może to coś krzaczy. po za tym wątek wykonuje się normalnie i widać, że cała procedura wykonuje się do końca, ale drugi raz procedury już się nie uruchomi, program nic nie mówi, trzeba zrestartować program, no i wtedy mam ten błąd.
Poniżej kod:

type
TSzukajPlik = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

procedure TSzukajAplikacji.SzukajStacjiBtnClick(Sender: TObject);
var
NewThread: TSzukajPlik;
begin
NewThread:= TSzukajPlik.Create(True);
NewThread.Resume;
end;

procedure TSzukajPlik.Execute;
var
i: Integer;
X,Y : Double;
begin
FreeOnTerminate:=True;
try
x:=0;
SzukajAplikacji.Gauge1.Visible:=TRUE;
SzukajAplikacji.ZnalNaStacjiLsBx.Items.Clear;
SzukajAplikacji.TymczasowyLsBx.Items.LoadFromFile(SDIAppForm.SciezkaAplikacji.Text+'Stacjekomputerywdomenie. txt');
for i:=0 to SzukajAplikacji.TymczasowyLsBx.Items.Count-1 do
begin
Y := SzukajAplikacji.TymczasowyLsBx.Items.Count;
X := SzukajAplikacji.Gauge1.Progress;
X := X + (100 / Y);
SzukajAplikacji.Gauge1.Progress := strtoint(FloatToStrF(x,ffFixed,100,0));
SzukajAplikacji.StatusBar1.Panels.Items[0].Text:=('Szukam na: '+SzukajAplikacji.TymczasowyLsBx.Items[i]);
if fileexists(' '+SzukajAplikacji.TymczasowyLsBx.Items[i]+''+SzukajAplikacji.PodajSciezke.text)
then
begin
SzukajAplikacji.ZnalNaStacjiLsBx.Items.add(SzukajAplikacji.TymczasowyLsBx.Items[i]);
SzukajAplikacji.LabeledEdit1.Text := IntToStr(SzukajAplikacji.ZnalNaStacjiLsBx.Items.count);
end
end;
finally
SzukajAplikacji.TymczasowyLsBx.Items.Clear;
X:=0;
SzukajAplikacji.Gauge1.Progress := round(strtoint(floattostr(X)));
X:=0;
SzukajAplikacji.Gauge1.Visible:=FALSE;
end;
SzukajAplikacji.StatusBar1.Panels.Items[0].Text:=('Gotowe!');
end;

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)



No cóż. W drugim tomie Delphi 4 - Vademecum Profesjonalisty znajduje się konkretny opis błędów i wyjątków. Otóż błąd o kodzie 1400 to jest : ERROR_INVALID_WINDOW_HANDLE czyli nic innego jak błędny uchwyt okna. Może się mylę ale poszperaj w tym kierunku ...;)

cytat:Perpetum napisał:

Chodzi o Delphi.
Co może oznaczać błąd (generowany przez wątek przy zamykaniu aplikacji):

Exception EOSError in module MojProgram.exe at 0000E0BE.
System Error. Code 1400.
Nieprawidłowe dojście okna.

W procedurze wątku mam kilka pętli i obsługa Gauge, może to coś krzaczy. po za tym wątek wykonuje się normalnie i widać, że cała procedura wykonuje się do końca, ale drugi raz procedury już się nie uruchomi, program nic nie mówi, trzeba zrestartować program, no i wtedy mam ten błąd.
Poniżej kod:

type
TSzukajPlik = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

procedure TSzukajAplikacji.SzukajStacjiBtnClick(Sender: TObject);
var
NewThread: TSzukajPlik;
begin
NewThread:= TSzukajPlik.Create(True);
NewThread.Resume;
end;

procedure TSzukajPlik.Execute;
var
i: Integer;
X,Y : Double;
begin
FreeOnTerminate:=True;
try
x:=0;
SzukajAplikacji.Gauge1.Visible:=TRUE;
SzukajAplikacji.ZnalNaStacjiLsBx.Items.Clear;
SzukajAplikacji.TymczasowyLsBx.Items.LoadFromFile(SDIAppForm.SciezkaAplikacji.Text+'Stacjekomputerywdomenie. txt');
for i:=0 to SzukajAplikacji.TymczasowyLsBx.Items.Count-1 do
begin
Y := SzukajAplikacji.TymczasowyLsBx.Items.Count;
X := SzukajAplikacji.Gauge1.Progress;
X := X + (100 / Y);
SzukajAplikacji.Gauge1.Progress := strtoint(FloatToStrF(x,ffFixed,100,0));
SzukajAplikacji.StatusBar1.Panels.Items[0].Text:=('Szukam na: '+SzukajAplikacji.TymczasowyLsBx.Items[i]);
if fileexists(' '+SzukajAplikacji.TymczasowyLsBx.Items[i]+''+SzukajAplikacji.PodajSciezke.text)
then
begin
SzukajAplikacji.ZnalNaStacjiLsBx.Items.add(SzukajAplikacji.TymczasowyLsBx.Items[i]);
SzukajAplikacji.LabeledEdit1.Text := IntToStr(SzukajAplikacji.ZnalNaStacjiLsBx.Items.count);
end
end;
finally
SzukajAplikacji.TymczasowyLsBx.Items.Clear;
X:=0;
SzukajAplikacji.Gauge1.Progress := round(strtoint(floattostr(X)));
X:=0;
SzukajAplikacji.Gauge1.Visible:=FALSE;
end;
SzukajAplikacji.StatusBar1.Panels.Items[0].Text:=('Gotowe!');
end;

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)

Terminator

A poza tym jest wszystko w porządku?
Inny wątek działa normalnie. Może chodzi o to, że działa na jednej formatce, a poprzedni na drugiej, czyli w sumie trzy klasy i coś może się krzyżuje czy coś. Poniżej przedstawiam ten co działa normalnie. Sam odpalę gogle, ale jakby ktoś wiedział jak to rozwalić, proszę o info. Dzięki z góry.

type
TWyslij = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

//Komunikaty, przycisk "Wyslij" - wysyła NetSend-y do zaznaczonych komputerów
procedure TSDIAppForm.BitBtn4Click(Sender: TObject);
var
NewThread: TWyslij;
begin
NewThread:= TWyslij.Create(True);
NewThread.Resume;
end;

procedure TWyslij.Execute;
var
i,k:Integer;
begin
k:=0;
SDIAppForm.Gauge1.MinValue:=0;
SDIAppForm.Gauge1.BackColor:=clWhite;
SDIAppForm.Gauge1.MaxValue:=StrToInt(SDIAppForm.Label17.Caption);
FreeOnTerminate:=True;
for i:=0 to SDIAppForm.CheckListBox1.Items.Count-1 do
try
if SDIAppForm.CheckListBox1.Checked[i] then
begin
SDIAppForm.Wysylam.Caption:=SDIAppForm.CheckListBox1.Items.Strings[i];
inc(k);
SDIAppForm.Gauge1.Progress:=k;
SDIAppForm.NTMessage1.Send(SDIAppForm.TrescWiadMemo.Lines.GetText, SDIAppForm.CheckListBox1.Items.Strings[i]);
end;
except
//on Exception do{finally} Showmessage('Wystąpił błąd!');
end;
k:=0;
SDIAppForm.Gauge1.Progress:=k;
SDIAppForm.Gauge1.BackColor:=clActiveBorder;
SDIAppForm.Wysylam.Caption:='Wysłano!';
end;

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)

Wpadłem na zabójczy pomysł: może by tak ten błąd zignorować?
Wziąć go np w jakieś try, except, end i nic z tym nie zrobić? Chociaż wydaje mi się to głupim rozwiązaniem, a nawet nie wiem jak dojść w którym to momencie szuka tego uchwytu i po co.

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)



Proponuje skorzystać z F7, przeważnie pokazuje w którym momecie jest bląd. Chociaż mogę się mylić.

Jestem z PD, jak nie wiesz co to, to pytaj.

Znalazłem i naprawiłem. Wyczaiłem na czym mi się wywala. Nie wiem tylko dlaczego tak jest, może jak ktoś wie, to niech oświeci, może dla potomnych informacja się przyda.
Dziwnie to wyglądało: SzukajAplikacji.TymczasowyLsBx nie był chyba po wykonaniu się wątku usunięty, bo metodą organoleptyczną wyczaiłem, że liczba Itemów jest równa 0, jeśli byłby usunięty miałbym błąd (podliczałem go sobie), jednak itemy nie chciały się chyba załadować z nieznanych mi powodów. Teraz niech się gonią. Obszedłem to w ten sposób i chyba powinno mi to wystarczyć.

procedure TSzukajAplikacji.SzukajStacjiBtnClick(Sender: TObject);
var
NewThread: TSzukajPlik;
begin
SzukajAplikacji.TymczasowyLsBx.Items.LoadFromFile(SDIAppForm.SciezkaAplikacji.Text+'Stacjekomputerywdomenie. txt'); //To przeniosłem z procedury "procedure TSzukajPlik.Execute"
NewThread:= TSzukajPlik.Create(True);
NewThread.Resume;
end;

Wspomnianą linię wywaliłem z "procedure TSzukajPlik.Execute".

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •