Проблемы с таймером в MFC.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

pominub
Сообщения: 24
Зарегистрирован: 16 ноя 2004, 09:35
Откуда: Spb

Здравствуйте. Такая ситуация:
Есть txt файл. Я хочу читать построчно и выводить строки в ListBox (при
нажатии кнопки)через
каждые ,допустим, 5 секунд. Когда строки заканчиваются,
нада чтоб таймер останавливался. Я делаю так:

CMytimerDlg::Timer()
{
int r=2000;
if (!Test)
{
Test=true;
SetTimer(ID_TIMER_1,5000,NULL);
}
else
{
Test=false;
KillTimer(ID_TIMER_1);
}
// TODO: Add your control notification handler code here

}

void CMytimerDlg::OnButton2() // кнопка
{
File.Open("time.txt", CFile::modeReadWrite );
File.SeekToBegin();

Timer();
}
void CMytimerDlg::OnTimer( UINT uTime)

{
if( File.ReadString(str)!=FALSE) читаем строку из файла
{
m_List.AddString(str); добавляем в список
}

else
{KillTimer(ID_TIMER_1); // если стр =0, то закрывем таймер
File.Close(); //закрываем файл
AfxMessageBox(str, MB_OK);} // эта строка должна быть нулевая
// Проверяем простро для наглядности

}
Вроде всё нормально работает, но только один раз.
При повторном нажатии на кнопку выскакивает
ошибка чтения( или записи) файла. Что происходит???
Что я делаю не так???
Заранее спасибо
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

При повторном нажатии на кнопку ты пытаешься вновь открыть уже открытый файл и запустить уже запущенный таймер. Вопрос: зачем? Цикл чтения и так должен работать в ответ на OnTimer(). Советую при первом нажатии на кнопку сразу ее заблокировать, а по завершении чтения разблокировать.
pominub
Сообщения: 24
Зарегистрирован: 16 ноя 2004, 09:35
Откуда: Spb

А как делается блокировка кнопки???
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Код: Выделить всё

GetDlgItem(ID_BUTTON2)->EnableWindow(FALSE);
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
pominub
Сообщения: 24
Зарегистрирован: 16 ноя 2004, 09:35
Откуда: Spb

Спасибо. Ещё вопрос по таймеру. Мне нужно следующее:

1. Плучить число (это я сделал)
2. Передать это число в таймер в виде параметра(это тоже)
(SetTimer(ID_TIMER_1,1000,NULL); - Здесь это 1 секунда)
3. По истечении времени (этого параметра) выполнить какое нибудь
действие.
И так в цикле до какого-нибудь условия.То есть параметр времени
у таймера каждый раз разный.
Короче говоря нужно слелать так, чтобы в цикле выполнялось какое-
нибудь действие по итечении промежутка времени (и этот промежуток
каждый раз разный)


Пробовал сделать это при помощи OnTimer, но походу эта функция
в цикле не работает. Как ещё это можно сделать???

Спасибо...
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Можно в конце OnTimer() убивать таймер и тут же перезапускать с другим таймаутом (предполагается, что к этому моменту он д.б. известен). Сам таймаут можно задавать, например, через глобальную переменную.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Я бы тоже так сделал.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
pominub
Сообщения: 24
Зарегистрирован: 16 ноя 2004, 09:35
Откуда: Spb

Я вобщем-то так и делаю:

Я хочу читать построчно файл и выводить строки в ListBox
(при нажатии на кнопку).
Но не через одно время(как это предусмотрено в таймере)
А, скажем, первую строку через 5 сек. Вторую через 10
и т д.

Я делаю так:
void CMytimeDlg::OnTimer( UINT uTime)
{
m_List.AddString(str);
KillTimer(ID_TIMER_1);
}

void CMytimeDlg::OnButton1()
{

File.Open("tim.txt", CFile::modeReadWrite);
while(File.ReadString(str)!=FALSE)
//Здесь мне нада вставить переменную,
//в которой менялся бы интервал.(5 , 10 и т д)
//Но пока даже с одним значением не получается
{
SetTimer(ID_TIMER_1,1000,NULL);
CMytimeDlg::RedrawWindow();

}
File.Close();
}
При запуске стрОки в лист-боксе не появляютя. Почему???
А если допустим вставить AfxMessageBox("ляляля") после SetTimer,

void CMytimeDlg::OnTimer( UINT uTime)
{
m_List.AddString(str);
KillTimer(ID_TIMER_1);
}

void CMytimeDlg::OnButton1()
{

File.Open("tim.txt", CFile::modeReadWrite);
while(File.ReadString(str)!=FALSE)
//Здесь мне нада вставить реременную,
//в которой менялся бы интервал.(5 , 10 и т д)
//Но пока даже с одним значением не получается
{
SetTimer(ID_TIMER_1,1000,NULL);
CMytimeDlg::RedrawWindow();
AfxMessageBox("ляляля"); ///// ВОТ ЗДЕСЬ////
}
File.Close();
}
то они появляются. Только после каждого нажатия на "OK".

Что вообще происходит???
Как сделать чтоб всё работало???
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Видно где-то подвисает. А дебагером не пробовал ходить по исходнику?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
pominub
Сообщения: 24
Зарегистрирован: 16 ноя 2004, 09:35
Откуда: Spb

Да нет. Всё нормально. Походу проблема не в этом.
Мне тут достаточно подробно ответили (на другом форуме)
Если интересно - посмотри:

http://relib.com/forums/topic.asp?pg=100&id=849817
Ответить