Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > Не работает простейшая прога с потоками... |
Автор: iPlay 8.10.2010, 21:26 | ||
Собственно не работает простейшая прога, не пойму почему???
|
Автор: iPlay 8.10.2010, 22:35 |
Народ, реально уже голову разбил ![]() ![]() |
Автор: ~FoX~ 9.10.2010, 08:05 |
iPlay, А что не работает то? |
Автор: Dom 9.10.2010, 14:32 |
И как предполагается он должен работать? Поскольку смысла код по большому счету не имеет. |
Автор: xkor 9.10.2010, 23:23 | ||
iPlay, и юзать Sleep в основном потоке оконного приложения не хорошо) смею предположить что вы хотите чтоб ваш код был таким:
и что вы слабо представляете что такое и для чего надо использовать synchronize... |
Автор: iPlay 10.10.2010, 22:05 | ||
Проблема была в том что потоки, просто не выполнялись!!!! Код взял в инете ![]() ![]() Еще вопрос можно, потоки заработали, интересно как синхронизировать с помощью критических секций? Есть код первый поток должен сгенить число, а второй возьмет ну например синус от него.
|
Автор: Dom 11.10.2010, 01:21 |
Пару подсказок: 1. Нельзя обращаться к VCL компонентам из кода потока. 2. Если очень хочется, то можно, но только через процедуру Synchronize, которая выполняется в контексте главного потока. А для ознакомления с потоками тут есть отличная статья - http://forum.vingrad.ru/forum/topic-60076.html |
Автор: iPlay 11.10.2010, 08:58 | ||
То есть насколько я понял, прошлый код с критическими секциями
неважно, какой поток захватит выполнение, поскольку я ограничил критическими секциями ресурс то они полюбому параллельно не выполнятся. Тогда вопрос, можно дополнять критические секции функцией synchronize();???? |
Автор: cat512 11.10.2010, 09:16 | ||||||
Не вводите людей в заблуждение! А кто запрещает???
Vcl-компонент? - ДА Обращение из кода потоков? - ДА Очень хочется? - да ![]()
Не надо ничего дополнять, используй либо секции либо synchronize. |
Автор: iPlay 11.10.2010, 09:50 | ||
То есть правильная реализация прошлой программы такова???
Просто я когда вот так сделал, все равно захватывает 2й поток иногда первее??? Чето я не пойму ![]() |
Автор: iPlay 11.10.2010, 10:42 |
Собственно просто, когда я работал с WinAPI там все четко, создавался поток в него передавался адрес функции которая обрабатывает данный поток, а реализацию писал в этой функции. Тут как-то интересно, функция tthread_name.execute выполняется и первым и вторым потоком, не могу понять что если мне нужно чтобы один поток выполнял одно а другой другое...??? Я просто скорее всего чего то недопонимаю.... А пример с критическими секциями, как раз таков что нужно чтобы один поток делал одно а другой другое. |
Автор: RomanEEP 11.10.2010, 11:01 |
Запрещает архитектура VCL, которая однопоточна. Например во время добавления строки в мемо может пересоздаться Handle memo из-за изменения системных настроек или действий в основном потоке. Про другие компоненты я вообще молчу. Результат работы такой предсказуем... правда не для конечного пользователя. |
Автор: cat512 11.10.2010, 11:11 | ||||||||
Я же показал пример выше! В методах Lock, Unlock - надо просто вызывать Enter Leave - соответственно. В чём проблема? Зачем 2 критические секции???????????????????????????????????????????????????????????????????? Толку от них как от козла молока!
С классом TThread тоже самое. Функцию. которую ты передавал в winapi, в классе TThread наз. Execute
Создай либо два разных класса, либо 2 разных функции, и в зависимости от параметра вызывай их в Execute Добавлено @ 11:24 2RomanEEP
Хай себе меняется! Каким образом мне это навредит, если я использую механизмы синхронизации??? Если "нож" острый, это совсем не значит, что его нельзя использовать осторожно. |
Автор: iPlay 11.10.2010, 11:25 |
Я написал, две отдельных функции, а в зависимости от какого параметра их запускать? |
Автор: cat512 11.10.2010, 11:40 | ||
Который собственно, ты будешь определять, в зависимости от того что надо. (Либо в конструкторе либо через переменную) |
Автор: iPlay 11.10.2010, 11:52 | ||
Только вот интересно, почему даже когда второму потоку сделал приоритет выше, все равно первый вызывается первым?
Добавлено @ 11:54 Кстати спасибо, cat512, стало намного понятнее... Сейчас только вот с приоритетами разобраться. |
Автор: iPlay 11.10.2010, 13:25 |
Просто я ограничил доступ критическими секциями к общей переменной result и установил приоритеты, этого недостаточно я так понял для надежной синхронизации? Сейчас перечитал еще раз теорию, вроде все сделал правильно, но что-то все равно не так, от критических секций толку никакого... |
Автор: iPlay 11.10.2010, 15:11 | ||
Я проплужил ![]() ![]()
Большое спасибо, сat512!!!! |