![]()  | 
	
 
  | 
| 
		 
			 
			#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.  |