Blad w watku: Nieprawidłowe dojscie (6)...

0

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.

0

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.

0

Spróbuj dać w Execute wątku takie coś:

try
{ program właściwy }
except
  on Exception do Continue;
end;
0

Niestety nie dziala. Pisze: BREAK or CONTINUE outside of loop.

0

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.

0

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

0

coś nie tak z typami:

var
  t : Pliki; { nie tthread, a pliki!!!}
begin
  t.Priority:=tpIdle;
  t := Pliki.Create(FALSE);
end;
0

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> - Ł

0

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.

0

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.

0

miło :) powodzenia :)

ale jakbyś korzystał z funkcji edycji postu zamias pisać ciągle nowe to by było też fajnie :)

0

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]

0

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;

1 użytkowników online, w tym zalogowanych: 0, gości: 1