|
#1
|
|||
|
|||
Потоки
Подскажите пожалуйста как реализовать потоки в делфях (полный ламер, если можно поподробнее)
Проблема в том что пока идет процедура просчета, программа не отвечает и нельзя даже нажать кнопочку санцел, которая прерывает работу процедуры. По идее с потоками должно получится, или может есть какой либо иной способ, помогите пожалуйста! |
#2
|
||||
|
||||
Вот суперский документ по потокам _hххp://decoding.narod.ru/book/doc/synchronization.zip
Имхо больше ничего и не нужно знать. И годиться не только для делфи |
#3
|
|||
|
|||
Цитата:
|
#4
|
||||
|
||||
Цитата:
Что значит "ссылка не на Инет ресурс". А на что? Или ты не догадался заменить _hххp на http. Или вообще выкинь из строки с адресом это - _hххp://, и все будет ок. Ну а если скачать не сможешь, пиши на decoding@narod.ru, вышлю. Цитата:
Если внутри цикла надо обрабатывать различные действия пользователя, нужно вставить внутрь цикла Application.ProcessMessages, и никакие потоки не нужны. Вот пример: Код:
begin // бесконечный цикл while true do begin { любые действия } Application.ProcessMessages; if ( условие_выхода ) then Break; end; // продолжаем работу после цикла end; Последний раз редактировалось Decoding, 03.06.2006 в 21:23. |
#5
|
||||
|
||||
Цитата:
2 bravo насмешил :beer: |
#6
|
||||
|
||||
Цитата:
Никогда не говори "никак"!!! Sleep() можно реализовать ручками, например так: Код:
var t: Cardinal; begin { Делай что надо } // Потом Sleep на секунду t := GetTickCount; while GetTickCount-t < 1000 do Application.ProcessMessages; { И спокойно работай дальше } end; И никакой поток тебе не нужен. Последний раз редактировалось Decoding, 04.06.2006 в 19:47. |
#7
|
||||
|
||||
Не хотел плодить темы поэтому пишу сюда (вопрос похож).
В общем есть функция и в ней два, а может и более раз, требуется обработать сообщение (действие) пользователя. Короче надо чтоб юзер нажал клавишу и в зависимости от того какую клавишу он нажал делать дальнейший расчёт. Вот примерно так я реализовал: Глобальные переменные (кажется так называются...) Код:
//. . . var a, b : Integer; WaitClick : Boolean; //. . . Обработка клавиатуры Код:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if WaitClick then begin case Key of VK_UP: a:=1; VK_DOWN: a:=2; VK_LEFT: b:=1; VK_RIGHT: b:=2; end; if (a <> 0) or (b <> 0) then WaitClick:=false; end; end; Функция Код:
function TForm1.MyFunc(x, y : Integer):TRect; begin a:=0; b:=0; WaitClick:=false; //. . . // Теперь требуется узнать какую клавишу нажал юзер StatusBar1.SimpleText:='Нажмите клавишу "Up" или "Down"'; WaitClick:=true; repeat Application.ProcessMessages; until a <> 0; StatusBar1.SimpleText:=''; if a = 1 then begin //Обрабатываем клавишу Up end; if a = 2 then begin //Обрабатываем клавишу Down end; //. . . // Второй раз требуется узнать какую клавишу нажал юзер StatusBar1.SimpleText:='Нажмите клавишу "Left" или "Right"'; WaitClick:=true; repeat Application.ProcessMessages; until b <> 0; StatusBar1.SimpleText:=''; if b = 1 then begin //Обрабатываем клавишу Left end; if b = 2 then begin //Обрабатываем клавишу Right end; //. . . end; Вроде всё лучше некуда, но проблема в том, что когда ожидается уже второе нажатие программа выскакивает в ПЕРВОМ цикле. Я трассировал код и после прохождения первого цикла я ставил бряк на until a <> 0; и запускал прогу. Через 1-2 секунды прога вываливается под бряком (но не всегда!). Короче чудеса да и только... Вот я и задумался об альтернативе такому приёму. Самому пока ничего в голову не пришло, может у кого то есть соображения по этому поводу? Последний раз редактировалось AXS, 29.11.2007 в 20:51. |