Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

В событии 2я процедура начинается раньше чем заканчивается 1я! [D7, WinXP]


Страницы:   1 2 3

RoLeX ©   (2006-10-24 15:43:00) 

Итак, предположим событие Button1Click. Между begin и end расположены две процедуры/функции:
procedure TForm1.Button1Click(Sender: TObject);
begin
procedure1;
procedure2;
end;

Так вот, у меня 2я процедура начинается раньше чем первая! Из-за этого ошибка. 1я процедура относительно продолжительная (делает скриншот экрана и сжимает его, а потом сохраняет файл).

Вот моя ситуация:
procedure GetScreenImage(AWidth, AHeight,AQuality: Integer);
var JPEG: TJPEGImage; bmp, tmpBitmap: TBitmap;
begin
JPEG:=TJPEGImage.Create;
Bmp:=TBitmap.Create;
tmpBitmap:=TBitmap.Create;
try
tmpBitmap.Width := AWidth;
tmpBitmap.Height := AHeight;
bmp.Width:=Screen.Width;
bmp.Height:=Screen.Height;
BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,GetDC(GetDesktopWindow), 0, 0, SRCCopy);
SetStretchBltMode(tmpBitmap.Canvas.Handle, STRETCH_HALFTONE);
StretchBlt(tmpBitmap.Canvas.Handle, 0, 0, AWidth, AHeight,bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, tmpBitmap.Canvas.CopyMode);
bmp.Assign(tmpBitmap);
JPEG.Assign(bmp);
JPEG.CompressionQuality:=AQuality;
jpeg.Compress;
JPEG.SaveToFile(ch+'\screen.jpg');
finally
JPEG.Free;
bmp.Free;
tmpBitmap.Free;
end;
end;

1-я процдура:GetScreenImage(StrToInt(plist[1]),StrToInt(plist[2]),StrToInt(plist[3]));

2-я процдура:
   with TFileStream.Create(ch+'\screen.jpg', fmOpenRead) do
   try
   file_size := Size;
   AThread.Connection.WriteBuffer(file_size, SizeOf(Int64));
   read_total := 0;
   while (read_total <> file_size) do
   begin
     read_current := Read(buf, 1024);
     AThread.Connection.WriteBuffer(buf, read_current);
     Inc(read_total, read_current);
   end;
   finally
     Free;
   end;


RoLeX   (2006-10-26 14:24:00) [1]

Не получается. Ввожу адрес ошибки (который в первом столбце самого большого фрейма окошка CPU) и он меня отправляет на строку с этим адресом окна CPU, а в исходниках ничего не подсвечивается и т.д.


Сергей М.   (2006-10-26 14:08:00) [2]


> cfvjcnjzntkmyj


самостоятельно


Сергей М.   (2006-10-26 14:07:00) [3]


> там не показывается. А в шестнадцатеричных кодах окна "CPU"
> я ничего не понимаю


"Там" действительно не показывается. И в тех самых "кодах" понимать тебя никто не заставляет.

От тебя требовалось всего лишь cfvjcnjzntkmyj изучить матчасть на предмет меню "Search -> Find Error ..." либо сообразить (что не так уж сложно) задать контрвопрос "Как определить эту строку ?"


RoLeX   (2006-10-26 14:01:00) [4]


> ch+'\'+IntToHex(AThread.Id)+'\screen.jpg'

Не пашет. пишет Id - Undeclared identifier.
Пробовал ch+'\'+IntToHex(AThread.ThreadId)+'\screen.jpg' пишет This is no overloaded version of IntToHex...


RoLeX   (2006-10-26 13:49:00) [5]


> Anatoly Podgoretsky ©   (26.10.06 13:27) [36]
> TidTCPServer без потоков по определению работать не может,
>  но тебе о них не надо заботиться в большинстве случаев.
>

Ну вот щас понадобилось, так как эти потоки ничего не ждут.


> Вопрос был при выполнении какой конкретно строчки текста
> твоей программы возникает эта ошибка ?

там не показывается. А в шестнадцатеричных кодах окна "CPU" я ничего не понимаю.


han_malign   (2006-10-26 13:46:00) [6]


> Не лез бы ты в потоки.


>> А разве TCPServer может без потоков?

чудило, "раньше времени" ничего не работает - все работает в свое время
 AThread1   AThread2
  proc1
  proc2      proc1   - "Не удается найти указанный файл."
........................
  proc1      proc1   - "Не удается найти указанный файл."

и даже вызов функции при заполнении списка параметров другой функции - не сделает выполнение функции(ни той, ни другой) атомарной операцией(да и, по сути, практически ничем не отличается от раздельного вызова)...
самое простое
    ch+'\'+IntToHex(AThread.Id)+'\screen.jpg'
- но лучше, всетаки, почитать про потоки и критические секции...


Anatoly Podgoretsky   (2006-10-26 13:27:00) [7]

TidTCPServer без потоков по определению работать не может, но тебе о них не надо заботиться в большинстве случаев.


Сергей М.   (2006-10-26 13:27:00) [8]


> вылетает ошибка следующая


Ты вообще русский язык понимать ?)

Вопрос был при выполнении какой конкретно строчкитекста твоей программы возникает эта ошибка ?


RoLeX   (2006-10-26 13:20:00) [9]


> Anatoly Podgoretsky ©   (26.10.06 13:12) [31]
> TCPServer а это что?

См. [17] я там выложил полный код события. А TCPServer это компонент такой. - TidTCPServer.


RoLeX   (2006-10-26 13:18:00) [10]


> Ну так выясни !Отладчик-то на что тебе дан ?


Пока сделал так:

   if FileExists(ch+'\screen.jpg') then DeleteFile(ch+'\screen.jpg');

   with TFileStream.Create( GetScreenImage(StrToInt(plist[1]),StrToInt(plist[2]),StrTo Int(plist[3])), fmOpenRead) do
   try
   file_size := Size;
   AThread.Connection.WriteBuffer(file_size, SizeOf(Int64));
   read_total := 0;
   while (read_total <> file_size) do
   begin
     read_current := Read(buf, 1024);
     AThread.Connection.WriteBuffer(buf, read_current);
     Inc(read_total, read_current);
   end;
   finally
     Free;
   end;
   AThread.Connection.Disconnect;


Т.е. чтобы полностью завершалась функция GetScreenImage я в её Result сделал адрес (ch + 'screen.jpg') и добавил выполнение этой функции в TFileStream.Create(...); чтобы TFileStream не начинала работать раньше времени.
Субъективно стало немного лучше, хотя не факт. Помоему всё зависит от нагруженности процессора, т.е. успеет ли совершиться функция GetScreenImage.

А вылетает ошибка следующая:
Project Project1.exe raised exception class EOutOfResources with message "Не удается найти указанный файл.". Process stopped. Use Step or Run to continue.


Сергей М.   (2006-10-26 13:14:00) [11]


> RoLeX   (26.10.06 13:08) [30]


> разве TCPServer может без потоков?


Зависит от BlockMode


Anatoly Podgoretsky   (2006-10-26 13:12:00) [12]

TCPServer а это что?


RoLeX   (2006-10-26 13:08:00) [13]


> Anatoly Podgoretsky ©   (25.10.06 22:59) [28]
> Не лез бы ты в потоки.

А разве TCPServer может без потоков?


Сергей М.   (2006-10-26 09:01:00) [14]


> RoLeX   (25.10.06 21:53) [27]


> неизвестно какая строка


Ну так выясни !
Отладчик-то на что тебе дан ?


Anatoly Podgoretsky   (2006-10-25 22:59:00) [15]

Не лез бы ты в потоки.


RoLeX   (2006-10-25 21:53:00) [16]


> Сергей М. ©   (24.10.06 16:59) [18]
> > RoLeX   (24.10.06 16:53) [17]Чудесно.И какая конкретно
> строка в этом коде приводит к "ошибке" ?

неизвестно какая строка.


> metalfan ©   (25.10.06 09:47) [26]
> > JPEG.SaveToFile(ch+'\screen.jpg');что за загадочная ch?
>  у тебя два потока в один момент могут выполнить эту строку?
> ... что и должно привести к ошибке, если значение ch одинаково
> для этих потоков.

Да, значение ch одинаковое.


metalfan   (2006-10-25 09:47:00) [17]


> JPEG.SaveToFile(ch+'\screen.jpg');

что за загадочная ch? у тебя два потока в один момент могут выполнить эту строку?... что и должно привести к ошибке, если значение ch одинаково для этих потоков.


Сергей М.   (2006-10-25 08:08:00) [18]


> RoLeX   (24.10.06 17:21) [20]
> что все затихли?


Покорнейше ждем-с твоего соизволения ответить на вопрос в [18]..


Пусик   (2006-10-24 21:44:00) [19]


> RoLeX   (24.10.06 15:43)


У тебя двойное нажатие на кнопку обрабатывается(с большой вероятностью) - отсюда и ошибка доступа.


metalfan   (2006-10-24 21:34:00) [20]

ничего хорошего! где stop объявлен?
кибальчиш, почитай про потоки для начала) а то ахинея какая-то выходит...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо