|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
| 
			 
			#1  
			
			
			
			
		 | ||||
| 
 | ||||
|  Синхронизация потоков У меня вопрос, делал синхронизацию(synchronize) при работе с Label и memo из потока, но все равно баги были страшные пришлось убрать, с чем могло быть связанно? не из за того что в этот момент могла быть работа из основного кода с этим же memo? | 
| 
			 
			#2  
			
			
			
			
		 | |||
| 
 | |||
|   сомнительно, этот метод как раз и предназначен для того, что бы основной поток и дополнительный не мешались. Вообще, для синхронизации преднвзначен объект TCriticalSection. | 
| 
			 
			#3  
			
			
			
			
		 | ||||
| 
 | ||||
|   показал бы "не правильно работающий код" с Synchronize? | 
| 
			 
			#4  
			
			
			
			
		 | ||||
| 
 | ||||
|   Код:  addmesseg:='(' + DateTimeToStr(Now()) + ') '+'отправлен запрос в плагин=> '+ UIN;
 Memo2.Lines.Add(addmesseg);
 writeln(logfile1,addmesseg);
 inc(statistik1);
 Label1.Caption:=IntToStr(statistik1);
 @plugExec := GetProcAddress(PPluginInfo(listKomand.Items[n1])^.handle,'PluginExec');
 Result:=PlugExec(UIN, Msg,PPluginInfo(listKomand.Items[n1])^.Index);
 i:=random(10);
   case i of
    0: ;
    1: Result:=Result+#10#13+rekl1.text;
    2: Result:=Result+#10#13+rekl2.text;
    3: Result:=Result+#10#13+rekl3.text;
    4: Result:=Result+#10#13+rekl4.text;
    5: Result:=Result+#10#13+rekl5.text;
    6: Result:=Result+#10#13+rekl6.text;
    7: Result:=Result+#10#13+rekl7.text;
    8: Result:=Result+#10#13+rekl8.text;
    9: Result:=Result+#10#13+rekl9.text;
  end;
form1.MessageSend(UIN,Result,nomer);ну и в программе этот поток ежесекундно раз по 3-5 вызывался изначально все было нормально, через минут 5 потом "началось" | 
| 
			 
			#5  
			
			
			
			
		 | ||||
| 
 | ||||
|   а если оставить только это: Код: var
  addmesseg: String;
begin
  addmesseg:='(' + DateTimeToStr(Now()) + ') '+'отправлен запрос в плагин=> 100';
 Memo2.Lines.Add(addmesseg);
// writeln(logfile1,addmesseg);
// inc(statistik1);
 Label1.Caption:=IntToStr(99);
end; | 
| 
			 
			#6  
			
			
			
			
		 | ||||
| 
 | ||||
|   не знаю, такое не могу протестировать с той нагрузкой с которой должно работать. | 
| 
			 
			#7  
			
			
			
			
		 | ||||
| 
 | ||||
|   просто без этого то код бесполезный совершенно) Код:  @plugExec := GetProcAddress(PPluginInfo(listKomand.Items[n1])^.handle,'PluginExec');
 Result:=PlugExec(UIN, Msg,PPluginInfo(listKomand.Items[n1])^.Index);
 i:=random(10);
   case i of
    0: ;
    1: Result:=Result+#10#13+rekl1;
    2: Result:=Result+#10#13+rekl2;
    3: Result:=Result+#10#13+rekl3;
    4: Result:=Result+#10#13+rekl4;
    5: Result:=Result+#10#13+rekl5;
    6: Result:=Result+#10#13+rekl6;
    7: Result:=Result+#10#13+rekl7;
    8: Result:=Result+#10#13+rekl8;
    9: Result:=Result+#10#13+rekl9;
  end;
form1.MessageSend(UIN,Result,nomer);А вот для такой работы с бд, Код: Query.SQL.text:='UPDATE bdbot SET INFObd=:par1 where UINbd=:par2';
Query.Parameters.ParamByName('par1').Value:=pacet.mesg;
Query.Parameters.ParamByName('par2').Value:=pacet.param2;
Query.ExecSQL;Код: Query.SQL.text:='Select UINbd from bdbot where nomber=:id';
Query.Parameters.ParamByName('id').Value:=Msg;
Query.Open; | 
| 
			 
			#8  
			
			
			
			
		 | ||||
| 
 | ||||
|   Query создаётся внутри потока, или на форме? | 
| 
			 
			#9  
			
			
			
			
		 | ||||
| 
 | ||||
|   не понял... Query уже настроено на форме ни там ни там не создаю | 
| 
			 
			#10  
			
			
			
			
		 | |||
| 
 | |||
|   Цитата: 
 Угу, конечно будут глюки. Пользуй CriticalSection для синхронизации. Synchronize обеспкчиает только синхронизации отрисовки. | 
| 
			 
			#11  
			
			
			
			
		 | ||||
| 
 | ||||
|   отрисовки? это простые добавления? в memo и т.д.? А чем CriticalSection лучше основного потока? ведь если критическая занята все рано ждем. Последний раз редактировалось ALexandr555, 03.07.2011 в 21:54. | 
| 
			 
			#12  
			
			
			
			
		 | ||||
| 
 | ||||
|   во время выполнения запросов в потоке отключай визуальные компоненты: DataSource.Enabled:=False; | 
| 
			 
			#13  
			
			
			
			
		 | ||||
| 
 | ||||
|   Спасибо, а нельзя работать без визуального? без DBGrid, седалал запрос на поиск и он возвращает найденое, или nill в случае если не нашли. | 
| 
			 
			#14  
			
			
			
			
		 | ||||
| 
 | ||||
|   да запросто. | 
| 
			 
			#15  
			
			
			
			
		 | ||||
| 
 | ||||
|   просто гугл по запросу "Не визуальная работа с бд" и "работа с бд без dbgrid" молчит   |