![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
многопоточность [D7, XP]
belmol © (2009-06-19 07:20:00)Доброго времени суток. Подскажите не могу понять как мне вот это упихать в отдельный поток чтоб основная форма не висла..
procedure TForm36.eu1Click(Sender: TObject);
var
bmp: TBitmap;
DC: HDC;
qual: integer;
label exit1;
begin
// подключаем библиотеку
if dll_loaded then
//----------------------------------- PS_InitSDK (активируем sdk)
if sdk_connect then
//----------------------------------- подключен ли сканер
if scaner_Connected then
begin
while not finger_on do
begin
StatusBar1.Panels[0].Text:='Приложите палец к сканеру.';
diod(1); // мигаем диодом ждем пока приложат палец
end;
// проверяем наличие отпечатков в базе
Form1.fingerset.Active:=false;
Form1.fingerset.SelectSQL.Text:='select * from FINGERS where ld=:ld and num=:num';
Form1.fingerset.ParamByName('LD').AsInteger:=form1.FindDataSet1LD.AsInteger;
if RadioGroup1.ItemIndex>-1 then
Form1.fingerset.ParamByName('LD').AsInteger:=RadioGroup1.ItemIndex+1;
if RadioGroup2.ItemIndex>-1 then
Form1.fingerset.ParamByName('LD').AsInteger:=RadioGroup2.ItemIndex+6;
Form1.fingerset.Active:=true;
//------------------------------------------------
while finger_on do
begin
if Capture then
begin
////////////////// участок создания темплайта Form36.Label3.caption:='Качество изображения q = '+IntToStr(form36.image_q);
if (enrol_fin=1) then
begin
qual:=form36.image_q;
Form36.Label3.caption:='Качество изображения q = '+IntToStr(qual);
if (qual>80) then
begin
Form36.Label3.Font.Color:=clBlack;
//----сохраняем в базу
if (form1.fingersetLD.AsString='') then
form1.fingerset.Insert
else form1.fingerset.Edit;
form1.fingersetLD.AsInteger:=form1.finddataset1ld.AsInteger;
// номер пальца...
if RadioGroup1.ItemIndex>-1 then
form1.fingersetNUM.AsInteger:=RadioGroup1.ItemIndex+1;
if RadioGroup2.ItemIndex>-1 then
form1.fingersetNUM.AsInteger:=RadioGroup2.ItemIndex+6;
// заливаем "слепок" RBlobStream:=form1.fingerset.CreateBlobStream(form1.fingerset.FieldByName('TEMLA TE') ,bmReadWrite);
RBlobStream.WriteBuffer(templ, SizeOf(templ));
try
form1.fingerset.Post;
except end;
end ELSE begin
Form36.Label3.caption:='Качество изображения q = '+IntToStr(qual); Form36.Label3.Font.Color:=clRed;
end;
//------------------------------------------------
if Draw_image then // рисуем в большое окно,присваиваем хандл имаджу
begin
Label5.Caption:='q='+IntToStr(qual);
bmp:=TBitmap.Create;
bmp.Height:=image_Height;
bmp.Width:=image_Width;
DC:=GetDC(form36.Handle); //Дескpиптоp экpана
bitblt(bmp.Canvas.Handle, -8, -3, image_Width, image_Height,DC, 0, 0, SRCCOPY);
image11.Picture.Assign(bmp);
ReleaseDC(0, DC);
Imageloaded(bmp); // отображаем по месту
bmp.Free;
end;
end;
end;
end;
end
else MessageDlg('Сканер не подключен!!', mtError, [mbOK], 0);
exit1:
Capture_abort;
try
diod(2);
sdk_disconnect;
dll_unloaded;
finally end;
end;
Сергей М. (2009-06-19 11:30:00) [1]
> я его подбирал методами практически "тыка"
Ну тогда и совет будет "тыковый" - вставь в тело цикла строчку Application.ProcessMessages
Andy BitOff (2009-06-19 11:03:00) [2]
> Сергей М. © (19.06.09 10:48) [19]
> А где описание работы ф-ции _PS_SetDiod@4' ?
> И что такое finger_on ?
Мне кажется, что в _PS_SetDiod@4 проблем не должно быть. Установка значения диода, по идее ни как не должно сказаться на поточности.
А вот finger_on действительно интересно.
belmol (2009-06-19 10:51:00) [3]если говорить честно я его подбирал методами практически "тыка" )))
а реального описалова просто нет. все облазил..
Сергей М. (2009-06-19 10:48:00) [4]А где описание работы ф-ции _PS_SetDiod@4' ?
И что такое finger_on ?
belmol (2009-06-19 10:43:00) [5]мигание диодами на сканере
belmol (2009-06-19 10:42:00) [6]function diod(status:LongInt):boolean;
type
TPS_SetDiod = function (status:LongInt):boolean;stdcall;
var
PS_SetDiod:TPS_SetDiod;
begin
diod:=false;
@PS_SetDiod := GetProcAddress(DLLInstance, '_PS_SetDiod@4');
if @PS_SetDiod <> nil then
begin
PS_SetDiod(status);
diod:=true;
end
else
MessageDlg('Ошибка импорта функции _PS_SetDiod@4 , '+SysErrorMessage(GetLastError), mtError, [mbOK], 0);
end;
belmol (2009-06-19 10:42:00) [7]StatusBar1.Panels[0].Text это еще не прибирался)
Сергей М. (2009-06-19 10:21:00) [8]Это напрямую зависит от того что такое finger_on и что творится внутри процедуры diod()
Кр.того зачем в цикле "пихать" одну и ту же строчку в StatusBar1.Panels[0].Text ?
belmol (2009-06-19 10:08:00) [9]хорошо, признаю что не понимаю сути вопроса, но нато и раздел для новечков))) вот в этот момент нажать кнопку на форме как?
while not finger_on do
begin
StatusBar1.Panels[0].Text:='Приложите палец к сканеру.';
diod(1); // мигаем диодом ждем пока приложат палец
end;
Сергей М. (2009-06-19 10:01:00) [10]
> следовательно проще ее полностью упихать
Нет, не проще. Ты глубокозаблуждаешься.
В VCL-приложении обращения к визуальным (и не только) VCL-контролам из доп.потоков недопустимы, а они у тебя будут сплошь и рядом, если ты "полностью упихаешь".
belmol (2009-06-19 09:42:00) [11]не вис, а замомрозка))
belmol (2009-06-19 09:41:00) [12]а запихивать все, для того чтоб когда сканер в режиме ожидания приложения пальца к оному, форма не позволяет нажать кнопку отмена..
далее при сканировании идет висяк пока он все это делает а в ммент сохранения в базу надо добавить один момент сигнальный, зависящий от нажатия кнопки на основной форме..
при этом вся функция должна идти последовательно в том порядке как есть.. а не паралельно..
следовательно проще ее полностью упихать в потом отдельный чтоб форма 36-я не висла.. примерно так.
Сергей М. (2009-06-19 09:38:00) [13]
> я разбираюсь
Вот и разбирайся, выполнение каких именно операторов в этом коде приводят к "вису" формы. На то есть отладчик.
belmol (2009-06-19 09:33:00) [14]кто сказал чтоя пишу)) я разбираюсь((
к тому же ни разу многопоточностью не занимался.
Эстет (2009-06-19 09:25:00) [15]Вот ведь... И такие люди пишут дактилоскопическую безопасность =(
Сергей М. (2009-06-19 09:21:00) [16]
> а если полностью упихать данную процедуру?
А зачем ?
belmol (2009-06-19 09:20:00) [17]а если полностью упихать данную процедуру??
MBo (2009-06-19 08:28:00) [18]Если задержки обусловлены сканером:
Выделяешь куски, которые обращаются к сканеру и выполняются долго, и при этом не требуют ввода пользователя, и не работают с интерфейсом.
В основном потоке готовишь данные для работы со сканером, передаешь команду и данные во вторичный поток.
Вторичный поток общается со сканером, сделав свое дело, сообщает об этом основному потоку и передает данные со сканера.
Сергей М. (2009-06-19 08:22:00) [19]
> как мне вот это упихать
Всё подряд без разбора ?)
Palladin (2009-06-19 08:21:00) [20]
> что сколько??
готов пожертвовать на свое развитие
> мне б пример
%DELPHI%\Demos\Threads
> куда чего запихать..
есть у меня пара мыслей...