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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2017, 13:55   #1
voronbird
Новичок
Джуниор
 
Регистрация: 12.07.2017
Сообщений: 2
По умолчанию Программа зависает занимая com-порт

Люди добрые, помогите умным советом. А то дельфист из меня...
Иногда, программа виснет на вот этом куске кода. Процесс при этом отказывается убиваться в Диспетчере задач. Подозреваю, что уходит в бесконечный цикл при попытке CloseHandle. Если цикл убрать (оставив CloseHandle), то com-порт остается занятым не пуская к себе другие приложения. Что тут можно сделать?

Код:
        CommHandle:= CreateFile(PChar('com'+IntToStr(Preferences.CheckPrinterPortNumber)), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
        if CommHandle = INVALID_HANDLE_VALUE then begin
          Sleep(200);
        end else begin
          try
            WriteFile(CommHandle,
                      chr($1B)+chr($25),
                      2,
                      Written,
                      nil);
          finally
            repeat until CloseHandle(CommHandle);
          end;

Последний раз редактировалось Аватар; 12.07.2017 в 14:37.
voronbird вне форума Ответить с цитированием
Старый 12.07.2017, 14:15   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Цитата:
Сообщение от voronbird Посмотреть сообщение
Код:
Pre ferences
- ну вот тут пробел, наверное, надо убрать или опять опечатка?
А почему CloseHandle - файл ведь нужно закрыть.
А, ну да, и правда CloseHandle(), только не в цикле, а однократно нужно вызывать. Попробуете без цикла и отпишитесь потом помогло или нет. Хорошо?
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.

Последний раз редактировалось Cuprum5; 12.07.2017 в 14:38.
Cuprum5 вне форума Ответить с цитированием
Старый 12.07.2017, 14:45   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Cuprum5
CloseFile - не существует вместо неё следует использовать CloseHandle.
voronbird
Цитата:
Сообщение от voronbird Посмотреть сообщение
repeat until
Лишнее. Запрещёно дважды освобождать хэндел.

Цитата:
Сообщение от voronbird Посмотреть сообщение
Если цикл убрать (оставив CloseHandle), то com-порт остается занятым не пуская к себе другие приложения. Что тут можно сделать?
Грохнуть все открытые файлы для вашего потока Thead.
Код:
CancelSynchronousIo(Self.Handle); // Принудительное завершение ожидания в/в
Но, я вам этого не говорил.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 12.07.2017 в 14:49.
Pavia вне форума Ответить с цитированием
Старый 12.07.2017, 14:46   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

ну наверное надо узнать(понять) почему это ОС не желает закрывать порт.
Цитата:
Если цикл убрать (оставив CloseHandle), то com-порт остается занятым
Цитата:
If the function fails, the return value is zero. To get extended error information, call GetLastError.
а не тупо повторять "магическое" слово "закройся" в надежде что волшебник вернется и ВСЕ сделает за вас.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.07.2017, 15:26   #5
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Цитата:
Сообщение от voronbird Посмотреть сообщение
Код:
chr($1B)+chr($25),
- вот это еще, наверное, неправильно написано. Нужно завести массив из 2-ух элементов и сюда 2-ым параметром передать указатель на него.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 12.07.2017, 15:31   #6
voronbird
Новичок
Джуниор
 
Регистрация: 12.07.2017
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
- вот это еще, наверное, неправильно написано. Нужно завести массив из 2-ух элементов и сюда 2-ым параметром передать указатель на него.
Не, эта часть точно правильная. Она прекрасно отрабатывает в 99 случаях из 100. А потом чего-то с com-портом случается. Спасибо за подсказки. Ушел проверять.
voronbird вне форума Ответить с цитированием
Старый 12.07.2017, 17:12   #7
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Просто дайте возможность винде обработать ваш запрос на "грохнуть"
Да-да, тривиальным добавлением не менее тривиального
Код:
Application.ProcessMessages;
в цикле REPEAT...

Неизвестному, пишущему господину Крапоткину - вы бы хоть представились

Последний раз редактировалось kropotkina-alice; 13.07.2017 в 00:36.
kropotkina-alice вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
зависает программа Gdasar C++ Builder 2 15.09.2013 18:02
Программа зависает SKS Общие вопросы Delphi 6 24.02.2012 07:30
Зависает программа Symba Общие вопросы Delphi 10 24.06.2011 11:48
Программа зависает Anubys Помощь студентам 0 20.05.2011 23:40
Зависает программа DimOn4Ik Общие вопросы Delphi 4 29.05.2010 21:05