Проблемы с таймером в MFC.
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Здравствуйте. Такая ситуация:
Есть 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);} // эта строка должна быть нулевая
// Проверяем простро для наглядности
}
Вроде всё нормально работает, но только один раз.
При повторном нажатии на кнопку выскакивает
ошибка чтения( или записи) файла. Что происходит???
Что я делаю не так???
Заранее спасибо
Есть 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);} // эта строка должна быть нулевая
// Проверяем простро для наглядности
}
Вроде всё нормально работает, но только один раз.
При повторном нажатии на кнопку выскакивает
ошибка чтения( или записи) файла. Что происходит???
Что я делаю не так???
Заранее спасибо
При повторном нажатии на кнопку ты пытаешься вновь открыть уже открытый файл и запустить уже запущенный таймер. Вопрос: зачем? Цикл чтения и так должен работать в ответ на OnTimer(). Советую при первом нажатии на кнопку сразу ее заблокировать, а по завершении чтения разблокировать.
А как делается блокировка кнопки???
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Код: Выделить всё
GetDlgItem(ID_BUTTON2)->EnableWindow(FALSE);
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Спасибо. Ещё вопрос по таймеру. Мне нужно следующее:
1. Плучить число (это я сделал)
2. Передать это число в таймер в виде параметра(это тоже)
(SetTimer(ID_TIMER_1,1000,NULL); - Здесь это 1 секунда)
3. По истечении времени (этого параметра) выполнить какое нибудь
действие.
И так в цикле до какого-нибудь условия.То есть параметр времени
у таймера каждый раз разный.
Короче говоря нужно слелать так, чтобы в цикле выполнялось какое-
нибудь действие по итечении промежутка времени (и этот промежуток
каждый раз разный)
Пробовал сделать это при помощи OnTimer, но походу эта функция
в цикле не работает. Как ещё это можно сделать???
Спасибо...
1. Плучить число (это я сделал)
2. Передать это число в таймер в виде параметра(это тоже)
(SetTimer(ID_TIMER_1,1000,NULL); - Здесь это 1 секунда)
3. По истечении времени (этого параметра) выполнить какое нибудь
действие.
И так в цикле до какого-нибудь условия.То есть параметр времени
у таймера каждый раз разный.
Короче говоря нужно слелать так, чтобы в цикле выполнялось какое-
нибудь действие по итечении промежутка времени (и этот промежуток
каждый раз разный)
Пробовал сделать это при помощи OnTimer, но походу эта функция
в цикле не работает. Как ещё это можно сделать???
Спасибо...
Можно в конце OnTimer() убивать таймер и тут же перезапускать с другим таймаутом (предполагается, что к этому моменту он д.б. известен). Сам таймаут можно задавать, например, через глобальную переменную.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Я бы тоже так сделал.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Я вобщем-то так и делаю:
Я хочу читать построчно файл и выводить строки в 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".
Что вообще происходит???
Как сделать чтоб всё работало???
Я хочу читать построчно файл и выводить строки в 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Да нет. Всё нормально. Походу проблема не в этом.
Мне тут достаточно подробно ответили (на другом форуме)
Если интересно - посмотри:
http://relib.com/forums/topic.asp?pg=100&id=849817
Мне тут достаточно подробно ответили (на другом форуме)
Если интересно - посмотри:
http://relib.com/forums/topic.asp?pg=100&id=849817