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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2013, 17:28   #21
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от the_deer_one Посмотреть сообщение
а вариант с флагом и лупом почему не работал, на вид он стрёмный, но работать то должен хотя бы в большинстве случаев.
Потому что второй вызов кнопки заходит в ту же функцию обработки и зависает в первом while(flag) цикле, где дожидается сбрасывания флага а для сбрасывания флага надо выйти из цикла.

Простейшее решение - просто игнорировать повторное нажатие кнопки: if (flag) return;
waleri вне форума Ответить с цитированием
Старый 01.10.2013, 07:54   #22
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

waleri
Цитата:
где дожидается сбрасывания флага а для сбрасывания флага надо выйти из цикла.
Да нет же. Сбрасывать флаг должно первое нажатие когда отработает.
the_deer_one вне форума Ответить с цитированием
Старый 01.10.2013, 08:30   #23
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

the_deer_one, а оно не отработает. При повторном нажатии выполнение первого вызова останавливается и начинается выполнение второго.

evg_m, все решилось гораздо проще. Переменную Thread выносим в глобальные (ну это я образно говорю, на самом деле вся эта структура обширный класс), а потом в функции ждем выполнение потока, перед тем как инициализировать данные заново.

Всем спасибо за помощь!
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 01.10.2013, 09:10   #24
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

zumm
Цитата:
При повторном нажатии выполнение первого вызова останавливается и начинается выполнение второго.
Чего это оно останавливается? Может тебе померещилось?
the_deer_one вне форума Ответить с цитированием
Старый 01.10.2013, 09:22   #25
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

the_deer_one, конечно же померещилось. UI поток просто резко делится на два и исполнят два участка кода псевдоодновременно.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 01.10.2013, 09:39   #26
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
а потом в функции ждем выполнение потока,
т.е. имеем
UI отдыхающий (не зависший, а именно ничего не делающий) "прокрутка петли" не в счет.
один и только один рабочий поток.

Ну и зачем было мучаться с потоком.
1) Только для того чтобы можно было шевелить мышку? Так она и так шевелилась бы.
2) Не пропадала картинка? а зачем она нужна пока нет результатов.
3) Иметь возможность остановить(перервать) расчеты? А где в той функции такая возможность.
4) Заранее подготовить данные для нового расчета? А где у нас место для хранения новых исходных данных?
Какую НЕОБХОДИМУЮ задачу мы решали вводя поток?

Потому что второй вызов кнопки заходит в ту же функцию обработки и зависает в первом while(flag) цикле, где дожидается сбрасывания флага а для сбрасывания флага
Надо чтобы отработал поток при условии что основной поток занял процессор, для проверки флага.
Основной поток занял процессор для проверки флага и ждет пока другой процесс(поток) получит процессор (чтобы он смог снять флаг), НО отдать его(процессор!) не спешит.
Получаем ВЗАИМНУЮ блокировку !!! (то что один при этом "работает" в бесконечном цикле сути не меняет).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 01.10.2013, 10:10   #27
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

evg_m, дополнительный поток в этой функции нужен для того (и только для того), что бы не вис UI поток. Для остальных потоков (их 16 штук, не считая UI потока) вызывающих функцию это не нужно.

Функция используется для получения некоторых данных с сервера, и лишать пользователя возможности взаимодействовать с программой на время загрузки данных нельзя.

Никакого флага больше нет. Эта была лишь топорная попытка решить проблему - костыль. Все обошлось более элегантно.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация 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