|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
30.09.2013, 17:28 | #21 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Цитата:
Простейшее решение - просто игнорировать повторное нажатие кнопки: if (flag) return; |
|
01.10.2013, 07:54 | #22 | |
Участник клуба
Регистрация: 04.04.2010
Сообщений: 1,554
|
waleri
Цитата:
|
|
01.10.2013, 08:30 | #23 |
БохЪ
Форумчанин
Регистрация: 30.09.2009
Сообщений: 724
|
the_deer_one, а оно не отработает. При повторном нажатии выполнение первого вызова останавливается и начинается выполнение второго.
evg_m, все решилось гораздо проще. Переменную Thread выносим в глобальные (ну это я образно говорю, на самом деле вся эта структура обширный класс), а потом в функции ждем выполнение потока, перед тем как инициализировать данные заново. Всем спасибо за помощь!
В планах порабощение вселенной...
|
01.10.2013, 09:10 | #24 | |
Участник клуба
Регистрация: 04.04.2010
Сообщений: 1,554
|
zumm
Цитата:
|
|
01.10.2013, 09:22 | #25 |
БохЪ
Форумчанин
Регистрация: 30.09.2009
Сообщений: 724
|
the_deer_one, конечно же померещилось. UI поток просто резко делится на два и исполнят два участка кода псевдоодновременно.
В планах порабощение вселенной...
|
01.10.2013, 09:39 | #26 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Цитата:
UI отдыхающий (не зависший, а именно ничего не делающий) "прокрутка петли" не в счет. один и только один рабочий поток. Ну и зачем было мучаться с потоком. 1) Только для того чтобы можно было шевелить мышку? Так она и так шевелилась бы. 2) Не пропадала картинка? а зачем она нужна пока нет результатов. 3) Иметь возможность остановить(перервать) расчеты? А где в той функции такая возможность. 4) Заранее подготовить данные для нового расчета? А где у нас место для хранения новых исходных данных? Какую НЕОБХОДИМУЮ задачу мы решали вводя поток? Потому что второй вызов кнопки заходит в ту же функцию обработки и зависает в первом while(flag) цикле, где дожидается сбрасывания флага а для сбрасывания флага Надо чтобы отработал поток при условии что основной поток занял процессор, для проверки флага. Основной поток занял процессор для проверки флага и ждет пока другой процесс(поток) получит процессор (чтобы он смог снять флаг), НО отдать его(процессор!) не спешит. Получаем ВЗАИМНУЮ блокировку !!! (то что один при этом "работает" в бесконечном цикле сути не меняет).
программа — запись алгоритма на языке понятном транслятору
|
|
01.10.2013, 10:10 | #27 |
БохЪ
Форумчанин
Регистрация: 30.09.2009
Сообщений: 724
|
evg_m, дополнительный поток в этой функции нужен для того (и только для того), что бы не вис UI поток. Для остальных потоков (их 16 штук, не считая UI потока) вызывающих функцию это не нужно.
Функция используется для получения некоторых данных с сервера, и лишать пользователя возможности взаимодействовать с программой на время загрузки данных нельзя. Никакого флага больше нет. Эта была лишь топорная попытка решить проблему - костыль. Все обошлось более элегантно.
В планах порабощение вселенной...
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Синхронизация | kuba1981 | PHP | 9 | 06.05.2013 11:39 |
Как получить доступ к методу потока(TThread) из основного потока? | Pcrepair | Общие вопросы Delphi | 3 | 30.03.2013 14:52 |
проблема при копировании одного столбца из одного файла в другой файл | tanunya | Помощь студентам | 0 | 24.02.2012 21:30 |
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 | BEL9ILLI | Общие вопросы Delphi | 3 | 06.12.2011 20:26 |
Как узнать номер потока из самого потока? | GaMeSTeR | Помощь студентам | 0 | 03.12.2010 09:50 |