Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.007 c
15-1245203187
brother
2009-06-17 05:46
2009.08.16
Защита от AUTORUN.INF вирусов.


2-1244993614
Gumz
2009-06-14 19:33
2009.08.16
Преобразование координат пикселей в градусы


2-1245394159
brix8x
2009-06-19 10:49
2009.08.16
Замена компонент от DevExpress на открытые решения


4-1214572314
CyberJack
2008-06-27 17:11
2009.08.16
Как получить ID системного динамика? И возможно ли это?


15-1244174940
Дмитрий С
2009-06-05 08:09
2009.08.16
Русские буквы в названиях таблиц/полей MySQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский