| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Задержка потока |
| Автор: NoliX 18.1.2006, 19:56 | ||
| Товарищи, подскажите, как сделать задержку в потоке, я весь форум перерыл, подходящего ничего не нашел... Сразу оговорюсь такой цикл мне не подходит....
Ttimer тоже не подходит, и sleep не подходит... В общем суть задачи состоит в том, что необходимо приостановить работу потока из самого потока на n секунд, при этом основное приложение должно нормально работать... (sleep был бы идеален если бы не тормозил всю программу...) В общем скажите кто, что знает... Добавлено @ 20:00 ага, так, sleep тормозит поток если у него нету синхронизации, а с синхронизацией как задержку поставить? |
| Автор: Демо 18.1.2006, 20:08 |
| NoliX Если у тебя несколько потоков, то Sleep приостанавливает выполнение только того потока, в котором выполняется Sleep. Опиши понятнее, что ты хочешь сделать. Добавлено @ 20:10 PS. Не понял, зачем в WINAPI тему? |
| Автор: NoliX 18.1.2006, 20:17 |
| упс, пардон, темой промахнулся.... Итак есть 2 формы, есть поток, поток вызывается с первой формы и выполняет действия с периодичность в несколько секунд, после того как поток закончил свое черное дело первая форма прячется и появляется вторая форма Тут 2 подводных камня: 1. Если вызвать поток без синхронизации, то вторая форма не открывается, пишет ошибку, что не верный дескриптор окна 2.Если использовать синхронизацию, то sleep находящийся в потоке подвешивает программу Вопрос: Что делать? |
| Автор: _hunter 18.1.2006, 20:33 |
| а почему бы не открывать вторую форму из потока? + стандартные методы извещения никто не отменял: после завершения работы потока шли главной форме сообщение, по которому она будет показывать вторую форму. можно еще и событие прикрутить ( но с сообщением будет по-проще ) |
| Автор: NoliX 18.1.2006, 20:37 | ||
| ну вот и хочу открыть вторую форму из потока, а она не хочет открываться без синхронизации, а сообщения программе слать я не умею, можно пример? Добавлено @ 20:43 мне нужно провести вот такие операции
первой формой является form4 второй form5 Добавлено @ 20:43 PS это не весь поток =) |
| Автор: Демо 18.1.2006, 21:00 | ||||
| Из дополнительного потока не создавай формы. Метод может быть таким:
|
| Автор: NoliX 18.1.2006, 21:08 |
| Демо, все бы хорошо, так я уже пробывал делать, но вот низадача, данные которые мне нужно передать являются локальми переменными процедуры, если выносить в отдельную процедуру вывод в форму2 то нужно это процеду с параметрами объявлять, а он отказывается синхронизировать такую процедуру или я туплю просто... Добавлено @ 21:12 просто в этом случае приходится переменные глобализировать, а этого не хотелось бы, кстати понравилась идея с извещениями, но как ее реализовать? |
| Автор: Демо 18.1.2006, 21:17 | ||
Какой процедуры? Где она выполняется? |
| Автор: NoliX 18.1.2006, 21:32 |
| у меня поток отдельным юнитом создан, в этом потоке процедура поток.Execute, в ней все и происходит |
| Автор: NoliX 18.1.2006, 22:10 |
| так щас посмотрю подходил ли мне такая штука, спасибо в общем и целом содержимое потока (по порядку) Подсчет данных (создание массивов их заполнение вычисление чисел) Начало цикла всякие операции ЗАДЕРЖКА вывод информации на форму 2 (с использованием переменных потока) операции опять конец цикла вывод информации на форму 2 (с использованием переменных потока) |
| Автор: Демо 18.1.2006, 22:15 |
| вывод информации на форму 2 (с использованием переменных потока) - Synchronyze(Procedure1) операции опять конец цикла вывод информации на форму 2 (с использованием переменных потока) - Synchronyze(Procedure2) или снова Synchronyze(Procedure1) |
| Автор: NoliX 18.1.2006, 22:41 |
| на синхронизации зависает теперь и все хмм, буду думать дальше... и все таки, можно програмно попросить из потока программу выполнить некоторые функции |
| Автор: Демо 18.1.2006, 22:48 | ||
Из потока, как и из любой другой функции, можно вызвать на выполнение любую функцию или процедуру... |
| Автор: NoliX 18.1.2006, 23:14 | ||
да нет, я не об этом, я вот об этом
|
| Автор: Poseidon 19.1.2006, 01:34 |
| Елы-палы. Ну и развели димагогию. Поток останавливается методом Suspend. Обратно возобновляется методом Resume. Пример нужен? |
| Автор: NoliX 19.1.2006, 13:21 |
| Poseidon не пойдет мне suspend! нужно остановить поток не из приложения, а приостановить его из самого себя в цикле, в нужном месте! |
| Автор: Alexeis 19.1.2006, 13:31 | ||
а откуда он будет возобновлятся?? |
| Автор: Poseidon 19.1.2006, 13:42 |
| Тогда sleep, что тут думать. Если это не основной поток программы, то зависания не будет, но поток "уснет" на указанное время. |
| Автор: AntonSaburov 19.1.2006, 13:42 |
| А объекты синхронизации Винды чем не нравятся ? Вот тут можно посмотреть - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_event_objects.asp |
| Автор: NoliX 19.1.2006, 13:48 | ||
| alexeis1, он будет приостановлен на несколько секунд, в общем мне нужен аналог sleep который при синхронизации не будет тормозить основную программу, либо каким-то образом передавать
|
| Автор: Poseidon 19.1.2006, 13:51 |
| "Какой-то образ" - это SendMesage (или PostMessage) |
| Автор: _hunter 19.1.2006, 13:53 |
| и опять мы возвращаемся к началу... Sleep() торможит только текущий поток ( остальные не тормозятся ) поэтому если наблюдается торможение -- где0то в логике ошибка. а что не понятно с сообщениями? |
| Автор: Alexeis 19.1.2006, 13:55 |
| Poseidon прав регистрируется сообщение У формы делается обработчик В нужный момент поток отправляет сообщение первой форме. обработчик запускает вторую форму - только так |
| Автор: NoliX 19.1.2006, 13:56 | ||
Poseidon, кажется то что надо, а как с помощью этого выполнить допустим
тоесть какими параметрами вызывать, или где их подглядеть? |
| Автор: Poseidon 19.1.2006, 14:08 | ||
| Какие параметры ты имеешь ввиду? В обще виде где-то так
В главной форме пишешь обработчик сообщения WM_User+101, а в нем то, что нужно сделать при получении этого сообщения. |
| Автор: NoliX 19.1.2006, 14:11 |
| так, кажется начинаю понимать, осталось ознать, как написать обработчик сообщения =( |
| Автор: Alexeis 19.1.2006, 14:13 | ||
вот пример drkb
|
| Автор: NoliX 19.1.2006, 14:16 |
| alexeis1, спасибо большое, сейчас попытаюсь разобраться, скорее всего это то, что нужно... |
| Автор: Poseidon 19.1.2006, 14:33 | ||||
Да на самом деле все очень просто. Вот как обработать наше WM_User+101
|
| Автор: NoliX 19.1.2006, 14:41 |
| Poseidon, все замечательно, это действительно то что надо, спасибо, mjkmrj вот последний вопрос, мне нужно в этом сообщении передать больше 2-х переменных, это возмжно? и как тогда их вызвать в процедуре обработки события, первые 2 как я понят вызываются WParam LParam |
| Автор: _hunter 19.1.2006, 14:48 |
| больше параметров передать нельзя. но никто не мешает создать структуру и передать одним из параметров указатель на нее |
| Автор: NoliX 19.1.2006, 14:49 |
| Все ясно, всем принимавшим участие огромное спасибо, в том числе и за терпение, дальше разберусь сам... |