Форум: "Основная";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];
ВнизПроект из D5 работает не правильно в ! Найти похожие ветки
← →
BorisUK (2003-04-28 06:51) [0]Делаю простую вещь... кручу прогрессбар в отдельном потоке пока юзер ждет выборку из базы.. В пятерке все работает (проверил) а в седьмой версии получается, как будто поток вовсе и не поток... тоесть все подвисает пока данные получаются из базы... Значение position в прогресбаре перестает увеличиваться (тоесть поток приостанавливается) на момент выполнения запроса.... В чем дело не пойму... Помогите разобраться... как добиться эффекта параллельной работы?
Данный простой пример работает как надо в Делфи 5, но не правильно в Делфи7
код потока:
unit SQLExecThread;
interface
uses
Classes, sysutils, Windows;
type
TSQLExecThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure Monitor;
public
end;
implementation
uses Unit1;
var
i : Integer;
procedure TSQLExecThread.Monitor;
begin
Form1.Progress.Position:=i;
Form1.percent.Caption:=IntToStr(i)+"%"; {Label}
Form1.Refresh;
end;
procedure TSQLExecThread.Execute;
begin
i:=0;
while not (Terminated) do
begin
inc(i);
if i=100 then i:=1;
Synchronize(Monitor);
sleep(500);
end;
i:=100;
Synchronize(Monitor);
sleep(300);
end;
end.
запускаю так:
var
MyThread : TSQLExecThread;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread := TSQLExecThread.Create(true);
MyThread.Resume;
MyThread.Priority:=tpNormal;
MyThread.FreeOnTerminate:=false;
end;
← →
MBo (2003-04-28 07:24) [1]на первый взгляд выглядит нормально, однако в приведенном коде нет никакого взаимодействия с базой - в таком варианте все это можно делать и в основном потоке по таймеру.
← →
BorisUK (2003-04-28 07:48) [2]
> MBo © (28.04.03 07:24)
Я повторяю что это простой пример... и не из него идет взаимодействие с базой, а из основного потока... Проблема в том что этот код работае не правильно в делфи 7 ...
Тоесть делаем ...
//Запуск потока
MyThread := TSQLExecThread.Create(true);
MyThread.Resume;
MyThread.Priority:=tpNormal;
MyThread.FreeOnTerminate:=false;
// потом запуск запроса
Query1.Active:=true;
// Завершаем поток...
MyThread.Terminate;
...
В результате (в Д7) поток тормозится до момента окончания выборки данных....
в Д5 - работает параллельно... Pfgecnbnt Запустите этот пример на Д5 и на Д7 чтоб убедится... или может только у меня такая байга. Но в чем проблем то - не пойму....???
← →
MBo (2003-04-28 07:54) [3]d7 уменя нет.
А может, в доп. потоке как раз запрос и выполнять?
Не знаю всей ситуации, но общие правила использования доп. потоков таковы - в них выполняются длительные вычисления, подключения и общение по сети и с БД, а вот интерфейсом должен заниматься основной поток.
← →
BorisUK (2003-04-28 08:10) [4]Согласен. Но в данном случае такой необходимости нет!
Мне не надо чтобы данные запрашивались в параллельном потоке, а в это время юзер выполнял какие то действия в основном потоке... В моем случае запрос данных это ключевой момент программы и не дождавшись его окончания никакие действия не разрешены..
Единственное что я хочу сделать это показать юзеру визуализацию этого процесса... Что и реализованно на Д5 и прекрасно работает...
Вопрос все тотже - почему тот же код закгруженный в Д7 работает как попало???
Ответы пож по существу. Заранее спасибо!
← →
Digitman (2003-04-28 09:17) [5]Концептуально такой подход вызывает серьезные нарекания.
Длительный и "тяжелый" запрос должен работать в доп.код.потоке, чтобы осн.код.поток в это же время мог оперативно реагировать на события/сообщения (в т.ч. - на CM_EXECPROC, посылаемое в методе Synchronize).
Если же требуется ограничить действия польз-ля на время выполнения запроса в доп.потоке, то это достаточно легко сделать, запретив фокус (либо скрыть) тех виз.элементов управления на форме (формах), доступ к которым со стороны польз-ля может нарушить корректный ход работы программы.
Полагаться же на одинаковую реализацию классов TThread и TQuery в Д5 и Д7 не следует
← →
BorisUK (2003-04-28 13:01) [6]Хорошо, вынес я запрос данных в отдельный процесс... дизэйблю что не льзя нажимать на время его течения.... а визуализацию наоборот в таймер основного процесса вынес... и фиг с ним...
Но все называется выкрутился. На самом деле реальная фишка, что процесс не захотел работать в Д7, хотя успешно работал в Д5 (приведенный выше пример) - все это все ещё присутствует и надеюсь не вылезет гденибудь ещё, где нельзя будет уже выкрутится.... Может кто-нибудь всеже скажет как быть с такой ситуацией? И как нужно написать этот процесс в Д7, чтоб он всеже работал ...?
← →
Digitman (2003-04-28 13:08) [7]
> называется выкрутился
не "выкрутился", а - сделал как правильно, как положено, концептуально !
> как нужно написать этот процесс в Д7, чтоб он всеже работал
не процесс, а трэд
не путайся в терминологии : это разные термины и разные сущности
здесь только одна рекомендация - иметь всегда под рукой док-цию по API и док-цию/исходники для тех классов, который обращаются к данным API и которые ты используешь у себя в приложении.
← →
ErikIvanov (2003-04-28 13:33) [8]У меня возникли похожие проблеммы только в D6. В Delphi 5 все работало нормально а в D6 регулярно получаю
EThread: Thread Error: The parameter is incorrect (87)
Frame at $00B6F5A0 (type: efkFinally)
Code at $00428DD9
Module "Classes", Procedure "TThread.CheckThreadError", Unit "", Line 0
Что делать?
Код мне досталься с Delphi 3 и я его подерживаю. Периписать все нереально.
← →
Anatoly Podgoretsky (2003-04-28 13:43) [9]ErikIvanov (28.04.03 13:33)
Раз код не переписывается, то зачем его запускать в Д6, он должен оставаться и поддерживаться в Д3, если ты конечно не враг себе.
← →
ErikIvanov (2003-04-28 14:27) [10]Я его перетащил в D5 и он работал. Много чего переписал, но все сразу НЕМОГУ!!!! А развиватся надо, есть компоненты только для D6 и исправлений для Midas в 6 много. Я туда добовляю подержку Midas.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c