Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2011, 16:46   #11
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
В потоке большая необходимость.
ПОЧТИ весь ваш код и так выполняется в основном потоке
или должен быть там.
Цитата:
Form1.Memo1.Lines.Add('1'); тоже нужно выполнять через Synchronize
Возможное исключение составляет только некая процедура MoveS1 да проверка условия.

Берем и добавляем таймер с интервалом в 500 (~0.5 секунды)
В его обработчик пишем код из потока (без внешнего цикла while click=0 и без sleep)
break заменяем на отключение таймера timer.enabled:=false;
click:=1 тоже самое (откл. таймер).
удаляем обертку synchronize
Код:
MD; //Скрин с WebBrowser, и если там присутствует определенный пиксель, присваивает переменной MDProv значение 1, если нету то 0
Form1.Memo1.Lines.Add('1');
if MDProv=0 then timer1/enabled:=false; //Если даже он прервет этот цикл, то код будет выполнятся дальше, и логи дальше должны идти
//count:= count+1;
//if count>10 then click:=1; //С этой строкой вообще как то аномально, если ее добавляю, то виснет на слипе, если убираю, то нормально все.
Perezar; //Аналогично с MD
MoveS1; //функция
Use1; //Аналогично с MD
получаем однопоточное приложение с нормальной реакцией.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.06.2011 в 16:56.
evg_m вне форума Ответить с цитированием
Старый 21.06.2011, 18:26   #12
Florento
Пользователь
 
Регистрация: 05.02.2011
Сообщений: 35
По умолчанию

спасибо большое. Попробую
Florento вне форума Ответить с цитированием
Старый 21.06.2011, 20:06   #13
Florento
Пользователь
 
Регистрация: 05.02.2011
Сообщений: 35
По умолчанию

В общем перепроверил код, все в нем нормально. Глюк в потоке. Или в его вызове, или в приоритете. Ситуация следующая:

Запускаю программу, нажимаю старт, запускается цикл, на слипе тормозит. Бывает что с 1 раза запустится цикл, и на слипе не тормознет, бывает раз 10 надо нажать старт ( старт создает поток ), чтобы он на слипе не тормознул.

Если запуск прошел нормально и он на слипе не тормознул, то программа работает без остановки. Уже 3 часа наверное цикл крутит и все ок, никакого зависания на слипе.

В чем может быть проблема? Потому что зависание происходит сразу после запуска на первом слипе. Может приоритет нужно какой нибудь другой? Или у потоков есть еще какие нибудь нюансы?
Florento вне форума Ответить с цитированием
Старый 21.06.2011, 21:54   #14
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

В потоке нельзя делать прямое обращение к объектам которые делают визуальные действия, будет всегда ошибка или не правильно работать. С ними нужно работать через функции и обращаться к ним с потока желательно методом Synchronize.
Sleep(1000) можно и на Sleep(10) должен работать в любом случае.


Поток без синхронизации
Цитата:
type
TForm1 = class(TForm)
...................
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
//функция для потока в TForm1
procedure ThreadsDone(Sender: TObject);
end;

//Поток
TWebBrowserView = class(TThread)
protected
procedure Execute; override;
public
constructor Create; virtual;
destructor Destroy; override;
end;

var
Form1: TForm1;
WebBrowserView: TWebBrowserView; //Имя потока

implementation

{$R *.dfm}

constructor TWebBrowserView.Create;
begin
inherited Create(True);
FreeOnTerminate := True; //Когда поток останавливается он уничтожается сам
resume; //запускаем поток
end;

destructor TWebBrowserView.Destroy;
begin
Terminate;
inherited;
end;

procedure TWebBrowserView.Execute;
begin
//Поток будет работать в функции TForm1
OnTerminate := Form1.ThreadsDone;
end;

procedure TForm1.ThreadsDone(Sender: TObject);
var
i:integer;
begin
//Ваш код
while click=0 do
begin
MD;
Memo1.Lines.Add('1');
if MDProv=0 then
begin
//Останавливает поток
WebBrowserView.Terminate;
break;
end;
inc(count);//равносильно этому count:= count+1;
if count>10 then click:=1;
Perezar;
MoveS1;
Use1;
sleep(1000);
end;
end;

// Пример запуска и остановки потока
procedure TForm1.Button1Click(Sender: TObject);
begin
//Создаем и запускаем поток
WebBrowserView :=TWebBrowserView.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//Останавливаем поток
WebBrowserView.Terminate;
end;

Последний раз редактировалось Aliens_wolfs; 21.06.2011 в 23:22.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция Sleep() ^Angel^ Общие вопросы C/C++ 9 07.05.2011 13:27
Как заменить sleep в потоке? чтобы получить задержку 5 мили Dasverd2010 Общие вопросы Delphi 13 07.09.2010 14:29
Sleep(50); за 63 мс... или за 47... Teksa Общие вопросы C/C++ 8 20.07.2010 08:34
Проблема с Sleep! k1r1ch Общие вопросы Delphi 11 20.06.2009 19:12
Аналог Sleep() Ants Общие вопросы Delphi 2 18.11.2008 13:11