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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2013, 03:30   #1
Xameleon666
Пользователь
 
Регистрация: 08.02.2012
Сообщений: 44
По умолчанию Visual C++ Будильник

Всем привет есть код рабочий (Visual C++ работаю в Microsoft Visual Studio 2010 ). в нём есть проблемма музыка играет в будильнике если указываеш какойто промежуток времени по истечению секундо мера к примеру. но будильник не хочет играть коректно когда указываеш конкретное время во сколько он должен заиграть. играет в разное время но не в указаное .вод код.
Цитата:
#include <windows.h>
#include <Mmsystem.h>
#include <tchar.h>
#include <commctrl.h>
#include <time.h>
#include "resource.h"

#pragma comment(lib,"Winmm.lib")
#pragma comment(lib,"comctl32")

HWND hDlg, hStart, hCancel, hHour, hMin, hSec, hSpinH, hSpinM, hSpinS, hRB_Clock, hRB_Timer;

HANDLE hThr;
int ThrParam;

BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
INITCOMMONCONTROLSEX icc = {sizeof(INITCOMMONCONTROLSEX)};
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
}

VOID EnableAll(int p)
{
EnableWindow(hStart, p);
EnableWindow(hCancel, !p);
EnableWindow(hHour, p);
EnableWindow(hMin, p);
EnableWindow(hSec, p);
EnableWindow(hSpinH, p);
EnableWindow(hSpinM, p);
EnableWindow(hSpinS, p);
EnableWindow(hRB_Clock, p);
EnableWindow(hRB_Timer, p);
}

DWORD WINAPI TheardFunction(PVOID pvPrg)
{
HANDLE hTimer = CreateWaitableTimer(NULL,FALSE,TEXT ("AlarmTimer"));
LARGE_INTEGER t;
t.QuadPart = -1*10000000*(*((int*)pvPrg));

/*TCHAR tmp[50];
wsprintf(tmp,TEXT("ThrParam = %d"),*((int*)pvPrg));
MessageBox(0,tmp,TEXT("Message"),MB _OK);*/

SetWaitableTimer(hTimer,&t,0,NULL,N ULL,TRUE);
WaitForSingleObject(hTimer,INFINITE );

/*int rez = WaitForSingleObject(hTimer,INFINITE );
TCHAR tmp[50];
if(rez == WAIT_OBJECT_0) _tcscpy(tmp,TEXT("WAIT_OBJECT_0"));
else if(rez == WAIT_TIMEOUT) _tcscpy(tmp,TEXT("WAIT_TIMEOUT"));
else if(rez == WAIT_FAILED) _tcscpy(tmp,TEXT("WAIT_FAILED"));*/

PlaySound(TEXT("sound\\alarm.wav"), NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
if(MessageBox(hDlg,TEXT("Подъем!"), TEXT("Сообщение"),MB_OK | MB_ICONINFORMATION) == IDOK) PlaySound(NULL,NULL,SND_ASYNC);

EnableAll(1);

CancelWaitableTimer(hTimer);
CloseHandle(hTimer);
//ExitThread(NULL);
return TRUE;
}

BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CLOSE:
EndDialog(hWnd, 0);
return TRUE;
case WM_INITDIALOG:
hDlg = hWnd;
hStart = GetDlgItem(hWnd, IDC_START);
hCancel = GetDlgItem(hWnd, IDC_CANCEL);
hHour = GetDlgItem(hWnd, IDC_HOR);
hMin = GetDlgItem(hWnd, IDC_MIN);
hSec = GetDlgItem(hWnd, IDC_SEC);
hSpinH = GetDlgItem(hWnd, IDC_H);
hSpinM = GetDlgItem(hWnd, IDC_M);
hSpinS = GetDlgItem(hWnd, IDC_S);
hRB_Clock = GetDlgItem(hWnd, IDC_CLOCK);
hRB_Timer = GetDlgItem(hWnd, IDC_TIMER);

SendMessage(hSpinH, UDM_SETRANGE32, 0, 23);
SendMessage(hSpinM, UDM_SETRANGE32, 0, 59);
SendMessage(hSpinS, UDM_SETRANGE32, 0, 59);

SendMessage(hRB_Clock,BM_SETCHECK,B ST_CHECKED,0);
return TRUE;
case WM_COMMAND:
if(LOWORD(wParam) == IDC_START)
{
int nHour = SendMessage(hSpinH, UDM_GETPOS32, 0, NULL);
int nMin = SendMessage(hSpinM, UDM_GETPOS32, 0, NULL);
int nSec = SendMessage(hSpinS, UDM_GETPOS32, 0, NULL);

if(SendMessage(hRB_Clock,BM_GETCHEC K,0,0)==BST_CHECKED)
{
time_t t = time(NULL);
struct tm Time = *(localtime(&t));
int UnivTime = (Time.tm_hour)*60*60 + (Time.tm_min)*60+ (Time.tm_sec);//
int TargetTime = nHour*60*60 + nMin*60+ nSec;//
if(TargetTime >= UnivTime) ThrParam = TargetTime - UnivTime;
else ThrParam = 24*60*60 - (UnivTime - TargetTime);//
}
else if(SendMessage(hRB_Timer,BM_GETCHEC K,0,0)==BST_CHECKED)
{
ThrParam = nHour*60*60 + nMin*60 + nSec; // ThrParam = nHour*60*60 + nMin*60+ nSec;
}

EnableAll(0);

/*TCHAR tmp[50];
wsprintf(tmp,TEXT("ThrParam = %d"),ThrParam);
MessageBox(0,tmp,TEXT("Message"),MB _OK);*/

hThr= CreateThread(NULL,NULL,TheardFuncti on,&ThrParam,NULL,NULL);

}
else if(LOWORD(wParam) == IDC_CANCEL)
{
TerminateThread(hThr,1);

EnableAll(1);
}
return TRUE;
}
return FALSE;
}



вот как я пологаю проблемный код тут включаетса в какое время должна заиграть музика
Цитата:
if(SendMessage(hRB_Clock,BM_GETCHEC K,0,0)==BST_CHECKED)
{
time_t t = time(NULL);
struct tm Time = *(localtime(&t));
int UnivTime = (Time.tm_hour)*60*60 + (Time.tm_min)*60+ (Time.tm_sec);//
int TargetTime = nHour*60*60 + nMin*60+ nSec;//
if(TargetTime >= UnivTime) ThrParam = TargetTime - UnivTime;
else ThrParam = 24*60*60 - (UnivTime - TargetTime);//
}
подскажите что не так?
Xameleon666 вне форума Ответить с цитированием
Старый 15.01.2013, 08:57   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Скорее всего не вычисляете правильно через сколько секунд должен сработать таймер. Возможно переполнение при вычислении QuadPart. Попробуйте сначал записать секунды в QuadPart а потом умножить переменную на нужные константы - тогда все выражение будет приведено в long long тип.

После того, как вычислите QuadPart скопируйте результат в FILETIME структуру и с помощью FileTimeToSystemTime() посмотрите что получится. Только знак не меняйте, т.е. должно быть положительным.
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Будильник cargo29 Общие вопросы Delphi 9 27.03.2011 07:49
Будильник. rabbitsnew Общие вопросы Delphi 2 30.08.2010 21:04
будильник waka2ebawer Общие вопросы Delphi 4 22.06.2010 10:47
Будильник Loraq Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 07.12.2009 21:05
Будильник DeDoK Общие вопросы Delphi 7 21.02.2008 10:02