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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2010, 18:05   #1
gagarin0
Пользователь
 
Регистрация: 01.10.2010
Сообщений: 24
По умолчанию Работа с потоками

Здравствуйте!
У меня программа, которая считывает данные с порта и записывает их в файл.
Считывание проводится с помощью потока.
Вопросы:
Как правильно закрывать файл и поток?
Как проверить или они закрылись?
Как сделать так, чтоб при закрытии всей программы, если запись в файл не закончилась, то дописать в него, а потом закрыть программу?
закрываю потоки так:
Код:
         if(reader)//Если поток чтения работает, завершить его
        {
                TerminateThread(reader,0);
                CloseHandle(overlapped.hEvent);//Закрываем объект-событие
                CloseHandle(reader);
        }
        if(port)//Если порт не закрыт
        {
                CloseHandle(port);//закрываем порт
                port=0;//обнулим переменную для дескриптора порта
        }
        if(handle)//Если файл не закрыт
        {
                close(handle);//Закроем файл, в который велась запись принимаемых данных
                handle=0;//Обнулим переменную для дескриптора файла
        }
С потоками и файлами только начал разбираться, поэтому еще не сильно понимаю как это все сделать. Подскажите, пожалуйста!
gagarin0 вне форума Ответить с цитированием
Старый 29.10.2010, 18:35   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от gagarin0 Посмотреть сообщение
Как правильно закрывать файл и поток?
файл надо закрывать через closehandle, других вариантов нет. поток должен завершаться сам, т.е. в конце его выполнения должно быть ExitThread(0).

Цитата:
Сообщение от gagarin0 Посмотреть сообщение
Как проверить или они закрылись?
проверка существования потока WaitForSingleObject если поток сейчас выполняется, функция ждёт когда поток завершится или истечём время указанное во втором параметре и только тогда вернёт управление, если потока нет, то ожидания не будет. Используй эту функцию указав вторым параметром ноль и анализируй код ошибки через GetLastError.
ситуация когда необходима проверка "закрыт ли файл" возникает при неправильном проектировании программы. Функция открыла файл то она должна его закрыть, ситуация когда один поток отрывает файл, а другой закрывает возникает при неправильном проектировании программы.

Цитата:
Сообщение от gagarin0 Посмотреть сообщение
Как сделать так, чтоб при закрытии всей программы, если запись в файл не закончилась, то дописать в него, а потом закрыть программу?
юзай WaitForSingleObject.

поток который работает с файлом или портом только сам открывать и закрывать файл. Функция TerminateThread предназначена для аварийных ситуаций и принудительного завершения. При закрытии программы достаточно поставить WaitForSingleObject.

Последний раз редактировалось rpy3uH; 29.10.2010 в 18:41.
rpy3uH вне форума Ответить с цитированием
Старый 29.10.2010, 20:52   #3
gagarin0
Пользователь
 
Регистрация: 01.10.2010
Сообщений: 24
По умолчанию

Спасибо, вам за советы!
Но хочу уточнить...
У меня два потока - один для чтения байт из порта и запись их в файл и еще один для посылки данных в порт.
Поток для чтения реагирует на событие прихода байта в порт, тогда он считывает приходящие байты и заносит в файл. Закрывается поток при нажатии на кнопку Закрыть порт и при закрытии формы.
Поток записи в порт активируется на кнопке Передать и после передачи приостанавливается.
Теперь вопрос: где мне ставить ExitThread(0)? в самом потоке? А в обработчике кнопки закрыть и закрития формы ставить какой-то флаг? К примеру так:
Код:
DWORD WINAPI ReadThread(LPVOID)
{
 ..........

 while(!flag_end)	//пока поток не будет прерван, выполняем цикл
  {
   .........
  }
handleoverlapped.hEvent);
ExitThread(0);
}
Так?
Дальше проверка правильности закрытия мне нужно для того, чтобы в случае какой-то ошибки порт не оказался заблокирован до перезагрузки системы...Для этого мне проверить, наверное, надо или закрылся правильно сам порт, правильно? Потоки тут же не при чем?
То есть if(!CloseHandle(port))? Если CloseHandle(port)=0, то ошибка и ошибку ловить GetLastError(). Так? А как потом реагировать на эти ошибки?
А для файла WaitForSingleObject(handle, INFINITE), так? Файл освобождается от записи а потом его закрыть...

Извиняюсь за такое количество вопросов...)

Последний раз редактировалось rpy3uH; 01.11.2010 в 08:40.
gagarin0 вне форума Ответить с цитированием
Старый 01.11.2010, 08:53   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

если я всё правильно понял, то надо примерно так

Код:
DWORD WINAPI ReadThread(LPVOID)
{
 ..........
  //открываем все необходимые потоку хендлы
  while(WaitForSingleObject(<хендл объекта-события>,0)==WAIT_OBJECT_0)//пока не нажали кнопку "закрыть"
  {
   .........
  }  
  //закрываем все используемые потоком хендлы 
  ExitThread(0);
}
в основном потоке программы надо заранее создать объект-событие (CreateEvent) и перевести его в сигнальное состояние (SetEvent).

при нажатии на кнопку "закрыть" надо сделать примерно следующее
Код:
    ResetEvent(<хендл объекта-события>); //переводим событие в несигнальное состояние
    WaitForSingleObject(<хендл потока>, INFINITE);   
    // поток завершился и закрыл все хендлы, можно завершать программу, блокировки порта не будет

Последний раз редактировалось rpy3uH; 01.11.2010 в 08:56.
rpy3uH вне форума Ответить с цитированием
Старый 05.11.2010, 02:30   #5
gagarin0
Пользователь
 
Регистрация: 01.10.2010
Сообщений: 24
По умолчанию

Сделал! Вроде, работает! Спасибо большое!!
gagarin0 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с потоками gagarin0 Помощь студентам 0 28.10.2010 22:12
работа с потоками session Общие вопросы C/C++ 6 21.06.2010 17:13
Работа с потоками Neymexa Общие вопросы .NET 16 23.04.2009 17:42
работа с потоками Alex_Pro Общие вопросы .NET 1 01.07.2008 07:25
C++, работа с потоками mat90x Помощь студентам 20 15.05.2008 22:20