Форум: "Базы";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];
ВнизКак избавиться от сообщения A Win32 API functuion failed Найти похожие ветки
← →
DIV (2002-11-28 07:59) [0]Написал диспетчер с 1 потоком.
Поток был нужен чтобы обработать нажатие клавиши прекращения обработки.
При выходе из программы По требованию (использую Application.Terminate)
получаю сообщение: Project Disp.exe exception class EWin32Error message "A Win32 API functuion failed". Process stopped.
И вижу это приложение в памяти.
Вот шапка исходника:
{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J+,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}
{$APPTYPE GUI}
unit Obr;
interface
uses
Classes,Basa,Windows,SysUtils,FileCtrl;
type
MyObr = class(TThread)
и т.д.
← →
Victor_Cr (2002-11-28 08:50) [1]Если у тебя ошибка выскакивает при закрытии приложения то это не обязательно глючит процедура прекращающая работу программы. Так сходу можно предположить, что ты чего-то не освободил. Напиши подробнее.
← →
DIV (2002-11-28 09:15) [2]Из переменных у меня там критична, пожалуй только
sr: TSearchRec;
Но я её освобождаю
procedure MyObr.Execute;
begin
try
while l_1<>2 do Work_f;
finally
FindClose(sr);
end;
end;
← →
Victor_Cr (2002-11-28 10:25) [3]Поставь в начале MyObr.Execute FreeOnTerminate := True
И еще приведи текст Work_f.
← →
DIV (2002-11-28 10:30) [4]Я уже пытался уменьшить программу обработки только до отдыха .. но все остается по-прежнему
Procedure MyObr.Work_F;
var
r2,r3:integer;
begin
D:= Now;
DecodeTime( D, Hour, Min, Sec, MSec);
FormWork.Memo1.Lines.Add(DateTimeToStr(Date)+" "+IntToStr(Hour)+ ":"+ IntToStr(Min)+ ":"+ IntToStr(Sec)+" Начало работы");
D:=Den_p;
DecodeDate(D, Year, Month, Day);
j:=0;
l_1:=1;
{ with DataModule1.Spr_fil do begin
First; //На начало
j:=0; //ни одного не за рейс не обработано
while (not Eof) and (l_1<>2) do
begin
l1:=0; //ошибок нет
Obr_F;
Next;
end;
end;}
if j=0 then //Если ничего за проход не найдено - отдыхать
begin
l_1:=3;
FormWork.SpOtd.Left:=FormWork.BitStop.Left;
FormWork.SpOtd.Visible:=True;
FormWork.ProBar.Visible:=True;
FormWork.Refresh;
DecodeTime(T_ot,Hour,Min,Sec,MSec);
r2:=Hour*360+Min*60+Sec; {секунд отдыха}
T1:=Time+T_ot; {время окончания отдыха}
while (Time<=T1) and (l_1<>2) and (l_1<>1) do
begin
T2:=T1-Time; // осталось отдыхать
DecodeTime(T2,Hour,Min,Sec,MSec);
r3:=r2- (Hour*360+Min*60+Sec);
FormWork.ProBar.Position:=100 * r3 div r2;
end;
FormWork.SpOtd.Visible:=False;
FormWork.ProBar.Visible:=False;
FormWork.Refresh;
end;
end;
← →
DIV (2002-11-28 10:58) [5]А вызываю этот поток так -
procedure TFormWork.N1Click(Sender: TObject);
var
Th:MyObr;
begin
FormWork.Caption:="Обработка файлов";
DbGrid1.DataSource:=nil;
Panel1.Visible:=false;
BitStop.Left:=FormWork.Width-BitStop.Width-8;
Memo1.Width:=BitStop.Left-16;
Memo1.Height:=FormWork.ClientHeight-8-23-28;
BitStop.Visible:=True;
L_1:=1;
FormWork.Menu:=nil;
Memo1.Top:=0;
Memo1.Visible:=True;
FormWork.Memo1.Clear;
// создаю поток
Th:=MyObr.Create(True);
// задаю приоритет
Th.Priority:=TpNormal;
// запускаю
Th.Resume;
end;
← →
Victor_Cr (2002-11-28 11:25) [6]Значит так все вызовы из потока Визуальных компонент типа TMemo, SpOtd, ProBar и т.д. нужно вызывать с помощью сообщений или синхронизации. Для того чтоб приложение не висло делаешь проверку не надо ли изменить значение ProBar и только тогда вызывать синхронизацию.
//Вместо FormWork.ProBar.Position:=100 * r3 div r2
// Попробуй что-то похожее на
if 100 * r3 div r2 <> OldValue then
begin
OldValue := 100 * r3 div r2;
Synchronize(AnyWhat);// Вызов FormWork.ProBar.Position:=100 * r3 div r2;
end;
← →
DIV (2002-11-28 11:42) [7]Спасибо!!! Я попробую. Сейчас убрал совсем ProBar - выходит нормально без ошибки
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c