Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
1

Печать. Программа частично перестает отвечать.

15.03.2012, 21:04. Показов 1577. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. При печати, программа перестает отвечать на Закрытие формы, хотя свободно перемещается по экрану курсором.

Проблемный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Printe()->BeginDoc();// запускаем печать
while ( Printe()->Printing ) // если печатает
{
 
                        for ( int i = 0; i < 6; i++ )
                        {
                        //выполняем то что нужно
                        }
 
                        //Printe()->Draw...
 
                        page++; // увеличиваем счетчик страниц
 
                        if ( page < PrintDialog1->Copies ) // счетчик меньше кол-ва покий
                        {
                                   Printe()->NewPage(); // новый лист
                        }
}
Printe()->EndDoc();// конец печати
Нужно добавить Application->ProcessMessages()? Если да, то где?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2012, 21:04
Ответы с готовыми решениями:

Программа перестает отвечать
После ввода чисел в массив, программа просто ничего не делает, и ничего не отвечает на нажатия на...

Программа перестает отвечать при вызове функции accept()
Здравсвуйте, пытаюсь работать с системными сокетами, сделав сервер для простенькой сетевой игры, но...

Программа перестает отвечать после сворачивания или перехода на другое окно
Такая проблема. Программа перестает отвечать после сворачивания. То есть если если включить, она...

Страница перестает отвечать
function start1(){ var q = Array(9), w = document.getElementById('weq'); for(var i=1;...

6
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
15.03.2012, 21:07 2
Цитата Сообщение от QVO Посмотреть сообщение
Нужно добавить Application->ProcessMessages()? Если да, то где?
Да почти везде, но все равно висеть будет жутко. Подобные процессы лучше выносить в отдельный поток.
1
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
15.03.2012, 21:18  [ТС] 3
DefineTrueFalse, я так понимаю строкой
C++
1
Printe()->BeginDoc();
мы добавляем печать в очередь. А строка
C++
1
Printe()->EndDoc();
начинает печать на принтере?
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
15.03.2012, 21:22 4
Не совсем, первая функция, означает, что начат сбор данных, а вот уже EndDoc сообщает, что все данные собраны и отправляет страницу в печать/очередь печати.
1
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
15.03.2012, 21:27  [ТС] 5
DefineTrueFalse, подскажите (покажите на примере если не сложно) как правильно печатать, ведь копий документа может быть 100 тысяч, так и компьютер зависнет.
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
15.03.2012, 22:08 6
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от QVO Посмотреть сообщение
DefineTrueFalse, подскажите (покажите на примере если не сложно) как правильно печатать, ведь копий документа может быть 100 тысяч, так и компьютер зависнет.
Комьютер вряд ли (хотя раньше была "тема" с полным зависанием ОС через команду печати), а вот функциональности приложения будет равна нулю точно. К сожалению, сейчас ничего конкретного по вопросу печати сказать не могу. Все что я помню, в любом описании печати через WinAPI найти можно. А вот простой пример обращения с потоком привести могу.
1. Поместите на форму ProgressBar.
2. Через IDE или вручную создайте потомок от класса TThread.
3. В событии Execute опишите необходимые действия, в данном случае это:
C++
1
2
3
4
5
6
7
8
TProgressBar * Progress = (TProgressBar*)
Application->MainForm->FindComponent("ProgressBar1");
while (1)
  for (int index = 0; index < 100; index++)
  {
    Progress->Position = index;
    Sleep(10);
  }
4. Объявите в юните с формой экземпляр созданного потока.
C++
1
2
public:
  TProgress * ProgressThread;
5. Инициализируйте его во время создания/инициализации формы.
C++
1
ProgressThread = new TProgress(true);
6. Поместите на форму 2 кнопки и подпишите их "Начать" и "Остановить".
7. В первой пропишите:
C++
1
ProgressThread->Resume();
8. Во второй пропишите:
C++
1
ProgressThread->Suspend();
9. Скомпилируйте проект и попробуйте его в действии. Вы увидите, что ProgressBar спокойно "пляшет под нашу дудку" не ограничивая нас в действиях.

Теперь подробнее о функциональности потока.
  • Resume - начинает/восстанавливает действие потока.
  • Suspend - приостанавливает (замораживает поток).
  • WaitFor - ожидание завершения потока (я не просто так взял бесконечный цикл, попробуйте остановить его данной функцией и увидите, что пройзодет, если будете тормозить загрузившийся поток данной функцией).
  • Terminate - тоже должен коня наскаку останавливать.
  • Start - начать действие потока, как и Resume выполняет прописанное в OnExecute.
К слову, при инициализации потока, его параметр булевая переменная, которая при значении истины - позволяет запустить поток позднее, а при ложном, начинает выполнять его сразу после инициализации. Ну остальное, думаю сам глянешь.
Миниатюры
Печать. Программа частично перестает отвечать.   Печать. Программа частично перестает отвечать.   Печать. Программа частично перестает отвечать.  

Печать. Программа частично перестает отвечать.  
Изображения
 
3
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
15.03.2012, 23:14  [ТС] 7
Решено банально.
Если кому нужно будет распечатать n-ое кол-во копий.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Printe()->BeginDoc();// запускаем печать
//>>>>>
while ( page != PrintDialog1->Copies ) // если страница не сравнялась с кол-во копий
//>>>>>
{
 
                        for ( int i = 0; i < 6; i++ )
                        {
                        //выполняем то что нужно
                        }
 
                        //Printe()->Draw...
 
                        page++; // увеличиваем счетчик страниц
 
                        if ( page < PrintDialog1->Copies ) // счетчик меньше кол-ва покий
                        {
                                   Printe()->NewPage(); // новый лист
                        }
}
Printe()->EndDoc();// конец печати
1
15.03.2012, 23:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2012, 23:14
Помогаю со студенческими работами здесь

ЖД временно перестает отвечать
Перестает работать ЖД при нагрузке на него. Включаю ProcessHacker -&gt; System Information смотрю по...

Chrome частично перестал отвечать на клики мышки
По непонятным причинам появился следующий баг: Chrome перестал отвечать на клики мышки (частично)....

Система полностью перестает отвечать
В последнее время стал сталкиваться с такой проблемой - система резко перестает отвечать на...

Видеокарта перестает отвечать под нагрузкой
Здравствуйте. Видеокарта MSI R9 290. Майнила. Сейчас после некоторого времени в тяжелых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru