Jako, że potrzebuję programu, który musi wygenerować setki plików na podstawie danych z arkusza kalkulacyjnego, skorzystałem z tutorialu http://4programmers.net/Delphi/Artyku%C5%82y/W%C4%85tki i utworzyłem sobie wątek z dwiema funkcjami, jedną czytającą arkusz i drugą eksportującą PDF-y, żeby nie robił tego wszystkiego w głównym wątku:
Watek = class(TThread)
private
nr : integer;
protected
function czytaj(src: string) : integer;
procedure eksport(l: integer; wzor: string; doc:string);
procedure Execute; override;
end;
Tak jak w tutorialu, jeden przycisk uruchamia wątek metodą Resume, drugi go zatrzymuje metodą Suspend, a inicjalizowany jest za pomocą Watek.Create(True) w bloku initialization. Samo Execute wygląda tak:
procedure Watek.Execute;
begin
nr := czytaj('D:\karty.xls');
eksport(nr, 'D:\karta.fr3', 'D:\');
end;
Problem polega na tym, że po kliknięciu na "start" (przycisk z Resume) nic się nie dzieje, nie w stylu wyskakiwania ostrzeżeń o błędzie ale program po prostu nic nie robi. Nie może to być wina samych funkcji gdyż wywoływane osobno (bez wątku) działają prawidłowo i generują dokumenty dokładnie tak jak powinny. Sam wątek też wiem że się na pewno uruchamia bo gdy np. wstawić do Execute jakąś dodatkową komendę po begin (np. ShowMessage()) to program ją normalnie wykonuje po kliknięciu na "start", chyba że się ją wstawi po którejś z tych funkcji, wtedy też nic nie robi tak jakby tej funkcji nie potrafił wykonać. Co ciekawe, po kliknięciu na "stop" wyskakuje "Thread Error. Odmowa dostępu (5)" pomimo że wszystko jest tak jak w tutorialu. Wiem, że musiałem coś sknocić z wywoływaniem tych funkcji w tym wątku, ale nie mam, pojęcia, jak to powinno być w sposób prawidłowy. Ma ktoś jakieś pomysły?