![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
потоки [D7, Win2k]
Arm79 © (2003-11-14 14:30:00)
Уважаемые знатоки, вопрос состоит в следующем. Как правильно использовать потоки? Пример, у меня есть поток, который переводит в верхний регистр ХТМЛ-теги. Правильнее будет каждый раз его создавать при изменении текста, а затем уничтожать, или создать один раз и потом замораживать и запускать его снова? Если правильнее второй вариант, то еще один доп. вопросик.
Form1onCreate
begin
Thread1:=TMyThread.Create(true);
Thread1.FreeonTerminate:=true;
end;
RichEdit1onChange
begin
if Key=">"
then Thread1.resume;
end;
TMyThread.Execute
begin
Syncronize(OutPut); // где OutPut - заменяет теги
end;
При такой организации первая замена проходит на ура, а при продолжениии редактирования выдает ошибку №6 - ошибка дескриптора потока. В окне отладчика Threads процесс после выполнения Stopped. Попробовал после синхронизации поставить Suspend, но ошибка не исчезла.
помогите, плиз!
Fay (2003-11-14 18:33:00) [1]
Здесь не нужны потоки. В некотором смысле их и нету, т.к. вне Synchronize нИчО не происходит.
Arm79 (2003-11-14 16:00:00) [2]
Спасибо. Буду пробовать.
Digitman (2003-11-14 15:59:00) [3]
> Допустимо ли использование метода suspend внутри execute?
допустимо
Arm79 (2003-11-14 15:49:00) [4]
Нет, не у Кариха, сам "допер".
С Вашего разрешения, я повторюсь:
Допустимо ли использование метода suspend внутри execute?
Что-то вроде
repeat
Synchronize(...);
Self.Suspend;
until Terminated;
Arm79 (2003-11-14 15:47:00) [5]
2 erik
Я рад, что Вы знаете. Представьте себе, я тоже знаю, но потоками стал заниматься только пару дней назад и многого еще не умею использовать. Материалы тоже читаю, но из них не всегда можно сразу определить правильный путь. Лучший материал - это консультация практика.
Digitman (2003-11-14 15:44:00) [6]
> Arm79
каково твое понимание "действа", происходящего в процессе, при вызове тобой метода Synchronize() ? Не у Кариха ли пример содрал бездумно ?
Reindeer Moss Eater (2003-11-14 15:44:00) [7]
И в чем же ужас работы в контексте основного потока?
erik (2003-11-14 15:43:00) [8]
Какой ужас, а ты знаеш что означает Synchronize? Видно что нетю Это означает, что твой код работает в основном потоке. И еще почитай про события и WaitForMultipleObjects.
Arm79 (2003-11-14 15:33:00) [9]
только на ввод ">"
Arm79 (2003-11-14 15:30:00) [10]
Допустимо ли использование метода suspend внутри execute?
Что-то вроде
repeat
Synchronize(...);
Self.Suspend;
until Terminated;
Reindeer Moss Eater (2003-11-14 15:30:00) [11]
А зачем на каждый OnChange вызывать переколбашывание текста?
Arm79 (2003-11-14 15:28:00) [12]
Понятно, значит для непрерывного исполнения нужно использовать
repeat synchronize(..) until Terminated;
Но я так пробовал, программа отдавала все ресурсы этому потоку и не работала. Приоритет я не менял, все осталось по умолчанию.
Reindeer Moss Eater (2003-11-14 15:23:00) [13]
ну и что? он завершился, следовательно, должет быть уничтожен, а в отладчике Threads он есть.
Значит тебе просто почудилось следующее:
а при продолжениии редактирования выдает ошибку №6 - ошибка дескриптора потока.
Arm79 (2003-11-14 15:21:00) [14]
2 Reindeer Moss Eater © (14.11.03 15:14) [1]
ну и что? он завершился, следовательно, должет быть уничтожен, а в отладчике Threads он есть.
Reindeer Moss Eater (2003-11-14 15:14:00) [15]
Поток завершается когда происходит возврат из его Execute.