Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.16;
Скачать: CL | DM;

Вниз

многопоточность   Найти похожие ветки 

 
belmol   (2009-06-19 07:20) [0]

Доброго времени суток. Подскажите не могу понять как мне вот это упихать в отдельный поток чтоб основная форма не висла..

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;


 
Palladin ©   (2009-06-19 08:00) [1]

Сколько?


 
belmol   (2009-06-19 08:20) [2]

что сколько??))  мне б  пример а не подрядчика)) или объяснить. куда чего запихать..


 
Palladin ©   (2009-06-19 08:21) [3]


> что сколько??

готов пожертвовать на свое развитие


> мне б  пример

%DELPHI%\Demos\Threads


> куда чего запихать..

есть у меня пара мыслей...


 
Сергей М. ©   (2009-06-19 08:22) [4]


> как мне вот это упихать


Всё подряд без разбора ?)


 
MBo ©   (2009-06-19 08:28) [5]

Если задержки обусловлены сканером:

Выделяешь куски, которые обращаются к сканеру и выполняются долго, и при этом не требуют ввода пользователя, и не работают с интерфейсом.

В основном потоке готовишь данные для работы со сканером, передаешь команду и данные во вторичный поток.

Вторичный поток общается со сканером, сделав свое дело, сообщает об этом основному потоку и передает данные со сканера.


 
belmol   (2009-06-19 09:20) [6]

а если полностью упихать данную процедуру??


 
Сергей М. ©   (2009-06-19 09:21) [7]


> а если полностью упихать данную процедуру?


А зачем ?


 
Эстет   (2009-06-19 09:25) [8]

Вот ведь... И такие люди пишут дактилоскопическую безопасность =(


 
belmol   (2009-06-19 09:33) [9]

кто сказал чтоя пишу)) я разбираюсь((
к тому же ни разу многопоточностью не занимался.


 
Сергей М. ©   (2009-06-19 09:38) [10]


> я разбираюсь


Вот и разбирайся, выполнение каких именно операторов в этом коде приводят к "вису" формы. На то есть отладчик.


 
belmol   (2009-06-19 09:41) [11]

а запихивать все, для того чтоб когда сканер в режиме ожидания приложения пальца к оному, форма не позволяет нажать кнопку отмена..
далее при сканировании идет висяк пока он все это делает а в ммент сохранения в базу надо добавить один момент сигнальный, зависящий от нажатия кнопки на основной форме..
при этом вся функция должна идти последовательно в том порядке как есть.. а не паралельно..
следовательно проще ее полностью упихать в потом отдельный чтоб форма 36-я не висла.. примерно так.


 
belmol   (2009-06-19 09:42) [12]

не вис, а замомрозка))


 
Сергей М. ©   (2009-06-19 10:01) [13]


> следовательно проще ее полностью упихать


Нет, не проще. Ты глубоко заблуждаешься.

В VCL-приложении обращения к визуальным (и не только) VCL-контролам из доп.потоков недопустимы, а они у тебя будут сплошь и рядом, если ты "полностью упихаешь".


 
belmol   (2009-06-19 10:08) [14]

хорошо, признаю что не понимаю сути вопроса, но нато и раздел для новечков)))  вот в этот момент нажать кнопку на форме как?
    while not finger_on do
    begin
    StatusBar1.Panels[0].Text:="Приложите палец к сканеру.";
    diod(1); // мигаем диодом ждем пока приложат палец
    end;


 
Сергей М. ©   (2009-06-19 10:21) [15]

Это напрямую зависит от того что такое finger_on и что творится внутри процедуры diod()

Кр.того зачем в цикле "пихать" одну и ту же строчку в StatusBar1.Panels[0].Text ?


 
belmol   (2009-06-19 10:42) [16]

StatusBar1.Panels[0].Text   это еще не прибирался)


 
belmol   (2009-06-19 10:42) [17]

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:43) [18]

мигание диодами на сканере


 
Сергей М. ©   (2009-06-19 10:48) [19]

А где описание работы ф-ции _PS_SetDiod@4" ?
И что такое finger_on ?


 
belmol   (2009-06-19 10:51) [20]

если говорить честно я его подбирал методами практически "тыка" )))
а реального описалова просто нет. все облазил..


 
Andy BitOff ©   (2009-06-19 11:03) [21]


> Сергей М. ©   (19.06.09 10:48) [19]
> А где описание работы ф-ции _PS_SetDiod@4" ?
> И что такое finger_on ?

Мне кажется, что в _PS_SetDiod@4 проблем не должно быть. Установка значения диода, по идее ни как не должно сказаться на поточности.
А вот finger_on действительно интересно.


 
Сергей М. ©   (2009-06-19 11:30) [22]


> я его подбирал методами практически "тыка"


Ну тогда и совет будет "тыковый" - вставь в тело цикла строчку Application.ProcessMessages



Страницы: 1 вся ветка

Текущий архив: 2009.08.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
2-1245311984
belmol
2009-06-18 11:59
2009.08.16
array[0..383] of Byte &amp; blob


15-1244747440
AlexLLL
2009-06-11 23:10
2009.08.16
"И ИЛИ НЕ Программа"


15-1245270610
Юрий
2009-06-18 00:30
2009.08.16
С днем рождения ! 18 июня 2009 четверг


15-1245044573
blurcode
2009-06-15 09:42
2009.08.16
Срубил меня остеохондроз, видимо.


3-1225916584
RamzesIII
2008-11-05 23:23
2009.08.16
Диаграмма