|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.08.2015, 12:03 | #1 |
Пользователь
Регистрация: 13.05.2007
Сообщений: 60
|
Ожидание вывода строки
Здравствуйте. Думал, думал, чего-то в голову ничего не приходит.
Есть моя написанная программа, в ней есть Memo, в которое по мере необходимости выводятся сообщения: sMemo1.Lines.Add('...'); Они выводятся после нажатия каких-то кнопок, после расчетов и т.д. Бывает так, что выводятся несколько сообщений подряд. Я решил немного переделать программу, чтобы сообщения выводились не в Memo, а в Label и по одному. Принцип такой: Выводится сообщение в Label. Если нужно вывести новое сообщение, то программа ждет, когда я нажму на Label и только после этого выводит следующее сообщение. Я сделал так: Добавил процедуры Код:
При нажатии на Label он очищается и следовательно можно выводить следующее сообщение. Т.е. получается, что когда в программе встречается команда вывода сообщения и оно не очищено, то программа "застревает" в цикле и ждет нажатия на сообщение. Программа не висит и все хорошо, но этот цикл занимает процессор и это плохо. Может можно что-то другое придумать? Фактически, допустим есть текст: Код:
|
27.08.2015, 17:28 | #2 |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 164
|
Можно добавлять сообщения в очередь и при необходимости вытаскивать оттуда, примерно так:
Код:
|
28.08.2015, 09:59 | #3 |
Пользователь
Регистрация: 13.05.2007
Сообщений: 60
|
System.Generics.Collections - это что такое в uses?? Выдает ошибку.
и такую структуру в делфи не встречал никогда: var Q:tqueue<string>; |
28.08.2015, 10:14 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
28.08.2015, 10:25 | #5 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
fanlis, а Delphi у Вас какая?
Если старая (< XE ), то используйте банальный TSTringList: объявите глобально: Код:
Код:
|
28.08.2015, 13:00 | #6 |
Пользователь
Регистрация: 13.05.2007
Сообщений: 60
|
Ну в общем я понял вашу идею и, в принципе, ее можно применить, хотя это не совсем то, что я хотел.
Например, выполняется процедура Код:
Мне бы желательно, чтобы программа останавливалась после сообщения "Привет". Потом я бы нажал на него, прочитал следующее, снова нажал и увидел бы кнопки и сообщение про эти кнопки. Но при этом нельзя делать сообщение в виде модального окна, потому что помимо нажатия на сообщения я могу, например, сменить закладку в PageControl или закрыть вообще программу. |
28.08.2015, 14:22 | #7 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
1. разбить вычисления на несколько групп (блоков/ПРОЦЕДУР)
в конце которых выводить нужное сообщение. (куда и как угодно) 2. не ждать появления сообщения, а запускать КАЖДЫЙ блок по нажатию кнопки. либо кнопке на каждый блок(процедуру) и блокировать (enabled:=false) при запуске либо одна кнопка, НО иметь возможность УЗНАВАТЬ какую процедуру(блок вычислений) надо выполнять. Код:
Код:
Цитата:
Код:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 28.08.2015 в 14:36. |
|
28.08.2015, 15:34 | #8 |
Пользователь
Регистрация: 13.05.2007
Сообщений: 60
|
вот как раз этого и не хотелось, точнее совсем не хотелось лазить по программе и переделывать ее. Она большая и готовая. Одно дело я автозаменой заменил sMemo1.Lines.Add на MemoAdd и дописал несколько процедур, а другое разбираться в программе и менять ее (разбивать все процедуры на блоки). Хотелось решить проблему "малой кровью".
Я так понимаю, именно того, чего я хочу, сделать невозможно, поэтому все предлагают обходные методы? |
28.08.2015, 16:05 | #9 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
вы хотите
ВЫПОЛНИТЬ остановку внутри процедуры без остановки. а это невозможно. процедуру можно остановить если есть другая процедура которая ее может запустить снова (это будут параллельные процессы) но это опять ПЕРЕДЕЛКА. и ОПЯТЬ надо будет править ваш "большой код" чтобы он имел возможность остановки. а разбиение делается почти(!) на автомате. если вычисления (точнее точки вывода сообщений) образуют линейную последовательность. Цитата:
2.находим сообщение 3.переносим все от начала до сообщения в отдельную процедуру 4.дописываем запуск данной(новой из п.2) процедуры. 5.если код исходный еще остался то п.1.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 28.08.2015 в 16:09. |
|
28.08.2015, 16:19 | #10 | |||
Форумчанин
Регистрация: 07.11.2011
Сообщений: 164
|
Цитата:
Цитата:
Код:
Цитата:
Код:
Та-же история и с закрытием формы: Код:
Также чтобы пользователь не запустил расчёты повторно можно создать процедуру (раз)блокировки UI (пройтись по всем кнопкам и присвоить enabled:=false/true), также для этих целей можно пользоваться атомами или критическими секциями. Ps: первоначально это случаем не было консольным приложением? |
|||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Нет вывода строки на экран | ДЕД_МАЗАЙ | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 4 | 23.11.2014 19:58 |
с++ рекурсивная функция вывода на экран строки в обратном порядке | archil | Помощь студентам | 1 | 26.05.2014 15:10 |
Ожидание завершения | DrBAXA | Общие вопросы Delphi | 8 | 26.01.2013 21:42 |
мультипоточное ожидание | Fun_tick | C# (си шарп) | 5 | 05.03.2012 15:00 |
Контроллер для вывода "бегущей строки" на светодиодные табло | HellMercenariess | Компьютерное железо | 4 | 20.07.2010 03:51 |