![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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" молчит
![]() |