Napisale program ktory przeczesuje siec w poszukiwaniu plikow i wlasnie to przeszukiwanie wlaczylem jako oddzielny watek. Problem w tym ze w czasie kompilowania programu wszystko jest dobrze a podczas dzialania kiedy jest uruchamiany watek wywala rozne bledy. "Project Raised Exception class EThread with message Thread Error Nieprawidlowe Dojscie (6) ". Bardzo prosze o pomoc. Jest to moj pierwszy program wykorzystujacy watki i nie chcial bym go porzucic przez ten blad.
Program wyglada tak:
procedura wywojujaca watek:
var
Pliki : TThread;
begin
Pliki.Priority:=tpIdle;
Pliki := TThread.Create(FALSE);
no i watek:
unit Unit2;
interface
uses
Classes, SysUtils;
type
Pliki = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
uses Unit1;
procedure Pliki.Execute;
begin
FreeOnTerminate := True;
{program wlasciwy}
end;
end.
Spróbuj dać w Execute wątku takie coś:
try
{ program właściwy }
except
on Exception do Continue;
end;
Niestety nie dziala. Pisze: BREAK or CONTINUE outside of loop.
Aha - no tak.. w sumie napisałem to automatycznie - standardowy wątek, gdzie wykonywana jest pewna pętla ma na początku:
while (not Terminated) do
i teraz dopiero to co napisałem - teraz właśnie FreeOnTerminate ma sens, gdyż możesz zawsze zamknąć ten wątek. Po prostu przyzwyczajenie. Jeśli masz inną budowę wątku - możesz to zaimplementować do swojej pętli.
Nie wiem dlaczego ale nie dziala. Znaczy ten kawalek co podales juz dziala ale program znow zwraca ten blad. Nie wiem dlaczego. Zawsze jak uruchamiam ten watek. W tym watku szukam plikow z wykorzystaniem dwoch ListBox-ow i PathTreeView. Zawsze po wystapieniu bledu zaznaczana jest ostatnia linijka projektu.
begin
Application.Initialize;
Application.CreateForm(TPLAN, PLAN);
Application.Run;
end.
Moje GG: 2246133
coś nie tak z typami:
var
t : Pliki; { nie tthread, a pliki!!!}
begin
t.Priority:=tpIdle;
t := Pliki.Create(FALSE);
end;
Niestety nadal nie dziala. Jestem wsciekly na DELPHI [diabel] :[ I zastanawiam sie DLACZEGO [???] [!!!]
Wstawiam caly program z waszymi poprawkami:
##################################################
Unit1:
##################################################
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, LanView, VirtualTrees, PathTreeView, Spin,
XPMan;
type
TPLAN = class(TForm)
foldery: TListBox;
szukaj: TButton;
lan: TLanView;
foldery2: TListBox;
tree: TPathTreeView;
iletego: TSpinEdit;
xp: TXPManifest;
fol2: TProgressBar;
fol: TProgressBar;
Button1: TButton;
procedure szukajClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure lanFinish;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
PLAN: TPLAN;
implementation
uses Unit2;
{$R *.dfm}
function ist(co,gdzie:string):boolean;
var q:word;
begin
for q:=1 to Length(co) do co[q]:=upcase(co[q]);
for q:=1 to Length(gdzie) do gdzie[q]:=upcase(gdzie[q]);
if pos(co,gdzie)>0 then ist:=true else ist:=false;
end;
function kropki(l:int64):string;
var qq,w:string;
a,s:word;
begin
str(l,qq);
str(l,w);
a:=length(qq) div 3;
for s:=1 to a do insert('.',w,length(qq)-(3*s)+1);
if w[1]='.' then delete(w,1,1);
if (w[1]='-')and(w[2]='.') then delete(w,2,1);
kropki:=w;
end;
procedure TPLAN.szukajClick(Sender: TObject);
begin
{szukaj}
iletego.Value:=1000;
tree.Items.Clear;
foldery.Items.Clear;
foldery2.Items.Clear;
lan.Items.Clear;
lan.Refresh;
end;
procedure TPLAN.FormCreate(Sender: TObject);
begin
iletego.Value:=1000;
end;
procedure TPLAN.lanFinish;
var
ile:integer;
t : Pliki;
begin
iletego.Value:=1000;
for ile:=1 to lan.Items.Count-1 do
if pos('\',lan.Items.Item[ile].Text)<>0 then
foldery.Items.Append('\\'+lan.Items.Item[ile].Text+'\');
t.Priority:=tpIdle;
t:= Pliki.Create(FALSE);
end;
procedure TPLAN.Button1Click(Sender: TObject);
var
t : Pliki;
begin
foldery.Items.Append('\\DOM\FTP\');
iletego.Value:=1000;
t.Priority:=tpIdle;
t:= Pliki.Create(FALSE);
end;
end.
##################################################
Unit2:
##################################################
unit Unit2;
interface
uses
Classes, SysUtils;
type
Pliki = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
uses Unit1;
procedure Pliki.Execute;
var numer,ile:integer;
sciezka,sciezka2:string;
blad:word;
plik:tsearchrec;
attrs,i,DriveType:integer;
begin
FreeOnTerminate := True;
while (not Terminated) do
try
with PLAN do
{1}while foldery.items.count>0 do begin
foldery2.Items.Append(foldery.Items.Names[0]);
foldery.Items.Delete(0);
{wyszukiwanie w zasobach od jednego folderu kolesia}
{2}while foldery2.Items.Count>0 do begin
sciezka:=foldery2.Items.Strings[0];
blad:=findfirst(sciezka+'*.*',Faanyfile,plik);
{22}if blad=0 then while blad=0 do begin
{4}if (plik.Name<>'.')and(plik.Name<>'..') then begin
Attrs := FileGetAttr(sciezka+plik.Name);
{5}if Attrs and faDirectory <> 0 then begin
foldery2.Items.Append(sciezka+plik.Name+'\');
{5}end else begin
sciezka2:=sciezka;
delete(sciezka2,1,2);
tree.DestPath:=sciezka2;
tree.AddPath;
{5}end;
{4}end;
blad:=findnext(plik);
{22}end;
foldery.Items.Delete(0);
{2}end;
{1}end;
except
on Exception do Continue;
end;
end;
end.
##################################################
Projekt:
##################################################
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {PLAN},
Unit2 in 'Unit2.pas';
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TPLAN, PLAN);
Application.Run;
end.
// rób wcięcia w kodzie, i używaj tagów < delphi> - Ł
Błąd musi wynikać z tego, że w jednym czasie więcej niż jeden wątek modyfikuje komponent. Wszystkie metody w wątku gdzie następuje modyfikacja komponentu daj w osobną metodę wątku .. aby je wywoływać dajesz: Synchronize(Metoda). Oczywiście pod warunkiem, że nie ma błędów w całym tym wyszukiwaniu.
Kiedy nie stosowalem watkow caly program wieszal sie. Wiec jestem zmuszony korzystac z watkow ale jakby ktos mial inny pomysl na obejscie tego problemu chetnie poslucham.
Jezeli mozna to prosze mi wyjasnic troche prosciej o tych metodach bo jestem troche poczatkujacy w watkach.
Juz dziekuje, sam sprawdzilem i zamierzam troche zmodyfikowac moj program. Moze wtedy zadziala jak powinien.
miło :) powodzenia :)
ale jakbyś korzystał z funkcji edycji postu zamias pisać ciągle nowe to by było też fajnie :)
Nadal nie dziala. Przebudowalem cala funkcje. Zawsze ten sam blad. Nie korzysta juz z zadnego VCL-a. Tylko z pliku INI. Nawet nie wyswietla tego co zrobil.... :/ :| ;( [wstyd]
jestem zmuszony korzystac z watkow ale jakby ktos mial inny pomysl na obejscie tego problemu chetnie poslucham.
co za problem - w pętli, która blokuje program, daj application.processmessages;