WM_TIMER - Speicherauslastung



  • hi zusammen,
    habe folgendes Prog.

    zeige einen tray icon an, welcher via odbc eine datenbank abfragt-> WM_TIMER im abstand von 10 sec.

    jedesmal wenn der timer ausgeführt wird, steigt die speicherauslastung im taskmanager. ist das normal??? die speicherauslastung steigt und steigt. kann das gefährlich werden????

    gruß

    bob



  • Dann scheinst du irgendwelche Ressourcen nicht freizugeben 😉
    Zeig mal, was du dort machst (Code)



  • den code zu posten ist mitsicherheit nicht sehr sinnig, da du ein paar stunden brauchen würdest um es zu finden.

    was meinst du genau mit resourcen freigeben?

    danke für deine schnelle antwort



  • Hier der code

    // Evl. Abstürze konnen durch zu lange Zeichenketten, welche beim TrayIcon angezeigt werden, passieren.
    // Maximale Stringlänge laut WinAPI 64 Zeichen (!!!!!!!!!!!!!!)
    
    #include <windows.h>
    #include <winuser.h>
    #include "resource.h"
    #include <sql.h>
    #include <sqlext.h>
    #include <sqltypes.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    #define ID_ICON1		100011115
    #define WM_ICONCLICK	(WM_APP+0)
    #define TIMER			100011116
    
    HINSTANCE hInst;
    HICON hIcon;
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    void Icon_in_Taskleiste (HWND hwnd, BOOL bAnzeigen);
    BOOL CALLBACK DialogProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
    BOOL CALLBACK InfoProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
    
    int GetData();
    int LoadParameters(HWND hwnd);
    BOOL CheckData(char *para);
    void test(char *test);
    
    //Globales Handle für das Fenster
    HWND hWnd;
    
    NOTIFYICONDATA		tsym;
    
    char error[660]="";
    int quit=0;
    int query=0;
    int kennz=0;
    
    char cPfad[]="C:\\ODBCCONN.INI";
    
    struct Client
    {
    	char cJob[66000];
    	char cDate[66000];
    	char cTime[66000];
    
    	char cName[66000];
    	char cSQL[66000];
    	char cUser[66000];
    	char cPasswort[66000];
    	char cPeriode[66000];
    };
    
    Client client;
    
    int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
    {
    	static TCHAR	szAppName[]=TEXT("bla");
    	HWND			hwnd;
    	MSG				msg;
    	WNDCLASSEX		wndclassex={0};
    	HANDLE			hSem;
    	HWND			ahwnd;
    
    	hInst=hInstance;
    
    	hSem=CreateSemaphore(NULL,0,1,"bla");
    	if (hSem) 
    	{
    		if(GetLastError()==ERROR_ALREADY_EXISTS) 
    		{
    			ahwnd=FindWindow(szAppName,0); 
    			MessageBox(ahwnd,"odbCConnector läuft bereits.\rUm das Programm neu zu starten, beenden Sie es bitte zuerst.","Fehler",MB_OK | MB_ICONERROR);
    			return 0;
    		}
    	}
    
    	wndclassex.cbSize			=sizeof(WNDCLASSEX);
    	wndclassex.style			=CS_HREDRAW | CS_VREDRAW;
    	wndclassex.lpfnWndProc		=WndProc;
    	wndclassex.cbClsExtra		=0;
    	wndclassex.cbWndExtra		=0;
    	wndclassex.hInstance		=hInstance ;
    	wndclassex.hIcon			=LoadIcon(NULL,IDI_APPLICATION);
    	wndclassex.hCursor			=LoadCursor(NULL,IDC_ARROW);
    	wndclassex.hbrBackground	=(HBRUSH)GetStockObject(WHITE_BRUSH);
    	wndclassex.lpszMenuName		=NULL;
    	wndclassex.lpszClassName	=szAppName;
    	wndclassex.hIconSm			=wndclassex.hIcon;
    
    	RegisterClassEx(&wndclassex);
    
    	hwnd=CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,szAppName,0,WS_OVERLAPPEDWINDOW,1024,750,100,30,NULL,NULL,hInstance,NULL);
    
    	hWnd=hwnd;
    
    	ShowWindow(hwnd,SW_SHOW);
    	UpdateWindow(hwnd);
    
    	while(GetMessage(&msg,NULL,0,0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    	static UINT		s_uTaskbarRestart;
    	POINT			pt;
    	HMENU			TMenu;
    	HANDLE			hDatei;
    
    	TMenu=GetSubMenu(LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU1)),0);
    
    	switch(message)
    	{
    		case WM_CREATE:
    			hDatei=CreateFile(cPfad,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
    			if (hDatei==INVALID_HANDLE_VALUE) 
    			{
    				DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIALOG),hwnd,DialogProc);
    			}
    			CloseHandle(hDatei);
    
    			LoadParameters(hwnd);
    			GetData();
    
    			s_uTaskbarRestart=RegisterWindowMessage(TEXT("WM_ICONOVER"));
    
    			hIcon=(HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_GDV_LOGO),IMAGE_ICON,0,0,LR_SHARED);
    
    			Icon_in_Taskleiste(hwnd,TRUE);
    
    			SetTimer(hwnd,TIMER,atoi(client.cPeriode)*1000,NULL);
            return 0;
    
    		case WM_ICONCLICK:
    			switch(lParam)
    			{
    				case WM_LBUTTONDBLCLK:
    					DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIALOG),hwnd,DialogProc);
    					KillTimer(hwnd,TIMER);
    					SetTimer(hwnd,TIMER,atoi(client.cPeriode)*1000,NULL);
    					SendMessage(hwnd,WM_TIMER,0,0);
    				break;
    
    				case WM_RBUTTONUP:
    					SetForegroundWindow(hwnd); 
    					GetCursorPos(&pt); 
    					TrackPopupMenu(TMenu,TPM_RIGHTBUTTON,pt.x,pt.y,0,hwnd, NULL);
    
    					PostMessage(hwnd, WM_NULL, 0, 0); 
    				break;
    			}
    		return 0;
    */
    		case WM_TIMER:
    			LoadParameters(hwnd);
    
    			if(strcmp(error,"")==0 || strcmp(error,"Fehler: Keine Datensätze vorhanden")==0)
    			{
    				if(query==0)
    				{
    					strcpy(error,"");
    					GetData();
    
    					strcpy(tsym.szTip,"sdfgdsfg");
    					Shell_NotifyIcon(NIM_MODIFY,&tsym);
    					ZeroMemory(&tsym,sizeof(NOTIFYICONDATA));
    				}
    			}
    		return 0;
    
    		case WM_DESTROY:
    			Icon_in_Taskleiste(hwnd,FALSE);
    			DestroyIcon(hIcon);
    			KillTimer(hwnd,TIMER);
    
    			PostQuitMessage(0);
    		return 0;
    
    		case WM_COMMAND:
                switch(LOWORD(wParam))
                {
                    case IDM_BEENDEN:
    					SendMessage(hwnd,WM_CLOSE,0,0);
                    break;
    				case IDM_AKTUALISIEREN:
    					strcpy(error,"");
    					SendMessage(hwnd,WM_TIMER,0,0);
    				break;
    				case IDM_EINSTELLUNGEN:
    					DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIALOG),hwnd,DialogProc);
    
    				break;
    				case IDM_INFO:
    					DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIALOG2),hwnd,InfoProc);
    				break;
                }
            break;
    
    		default:
    			if (message==s_uTaskbarRestart)
    			{
    				test("sdf");
    				Icon_in_Taskleiste(hwnd,TRUE);
    			}*/
    		break;
    	}
    	return DefWindowProc (hwnd,message,wParam,lParam) ;
    }
    
    void Icon_in_Taskleiste(HWND hwnd,BOOL bAnzeigen)
    {
    
    	char				*temp;
    
    	ZeroMemory(&tsym,sizeof(NOTIFYICONDATA));
    
    	temp=(char *)malloc(1000);
    
    	if (bAnzeigen)
    	{
    		tsym.cbSize				=sizeof(NOTIFYICONDATA);
    		tsym.hWnd				=hwnd;
    		tsym.uID				=ID_ICON1;
    		tsym.uFlags				=NIF_ICON | NIF_TIP | NIF_MESSAGE;
    		tsym.uCallbackMessage	=WM_ICONCLICK;
    		tsym.hIcon				=hIcon;
    
    		if(strlen(client.cDate)>10)
    		{
    			client.cDate[10]='\0';
    		}
    
    		if(strlen(client.cTime)>8)
    		{
    			client.cTime[8]='\0';
    		}
    
    		wsprintf(temp,"%s %s\r%s",client.cDate,client.cTime,client.cJob);
    
    		if(strlen(temp)>60)
    		{
    			temp[63]='\0';
    			temp[62]='.';
    			temp[61]='.';
    			temp[60]='.';
    		}
    
    		if(strcmp(error,"")==0)
    		{
    			strcpy(tsym.szTip,temp);
    		}
    		else
    		{
    			strcpy(tsym.szTip,error);
    		}
    
    		Shell_NotifyIcon(NIM_ADD, &tsym);
    	}
    	else
    	{
    		tsym.cbSize				=sizeof(NOTIFYICONDATA);
    		tsym.hWnd				=hwnd;
    		tsym.uID				=ID_ICON1;
    		tsym.uFlags				=0;
    
    		Shell_NotifyIcon(NIM_DELETE,&tsym);
    
    	}
    	free(temp);
    	return;
    }
    
    BOOL CALLBACK DialogProc(HWND hwnd,UINT Message,WPARAM wParam,LPARAM lParam)
    {
    	char		temp[660];
    
    	switch(Message)
    	{
    		case WM_INITDIALOG:
    			LoadParameters(hwnd);
    			SetDlgItemText(hwnd,IDC_NAME,client.cName);
    			SetDlgItemText(hwnd,IDC_SQL,client.cSQL);
    			SetDlgItemText(hwnd,IDC_USER,client.cUser);
    			SetDlgItemText(hwnd,IDC_PASSWORT,client.cPasswort);
    			SetDlgItemText(hwnd,IDC_PERIODE,client.cPeriode);
    		break;
            case WM_COMMAND:
    			switch(LOWORD(wParam))
    			{
    				case IDC_OK:
    
    					GetDlgItemText(hwnd,IDC_NAME,temp,66000);
    					WritePrivateProfileString("ODBC","Name",temp,cPfad);
    
    					GetDlgItemText(hwnd,IDC_SQL,temp,66000);
    					WritePrivateProfileString("ODBC","SQL",temp,cPfad);
    
    					GetDlgItemText(hwnd,IDC_USER,temp,66000);
    					WritePrivateProfileString("ODBC","User",temp,cPfad);
    
    					GetDlgItemText(hwnd,IDC_PASSWORT,temp,66000);
    					WritePrivateProfileString("ODBC","Passwd",temp,cPfad);
    
    					GetDlgItemText(hwnd,IDC_PERIODE,temp,66000);
    					WritePrivateProfileString("ODBC","Periode",temp,cPfad);
    
    					EndDialog(hwnd,IDOK);
    
    					LoadParameters(hwnd);
    
    					strcpy(error,"");
    
    					SendMessage(hWnd,WM_TIMER,0,0);
    				break;
                }
            break;
            default:
                return FALSE;
        }
    	return quit;
    }
    
    void test(char *test)
    {
    	MessageBox(NULL,test,"TEST",MB_OK);
    }
    
    int GetData()
    {
    	SQLHENV     henv;
    	SQLHDBC     hdbc;
    	SQLHSTMT    hstmt;
    	SQLRETURN   retcode;
    
    	char cJob[66000];
    	char cDatum[66000];
    	char cZeit[66000];
    	long len;
    
    	int kennz=0;
    
    	query=1;
    
    	retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
    	{
    		retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
    		if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
    		{
    			retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 
    			if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
    			{
    				SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, "5", 0);
    
    				retcode = SQLConnect(hdbc, (SQLCHAR*) client.cName, SQL_NTS,
    						(SQLCHAR*) client.cUser, SQL_NTS,
    						(SQLCHAR*) client.cPasswort, SQL_NTS);
    
    				if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    				{
    					//-----------------------------------------------------------------
    					retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
    					if (retcode==SQL_SUCCESS || retcode==SQL_SUCCESS_WITH_INFO)
    					{
    						retcode = SQLExecDirect(hstmt,(UCHAR*)client.cSQL,SQL_NTS);
    						if (retcode==SQL_SUCCESS || retcode==SQL_SUCCESS_WITH_INFO)
    						{
    							SQLBindCol(hstmt,1, SQL_C_CHAR,cJob, 66000, &len);
    							SQLBindCol(hstmt,2, SQL_C_CHAR,cDatum, 66000, &len);
    							SQLBindCol(hstmt,3, SQL_C_CHAR,cZeit, 66000, &len);
    							while (1) 
    							{
    								retcode = SQLFetch(hstmt);
    								if (retcode==SQL_SUCCESS || retcode==SQL_SUCCESS_WITH_INFO) 
    								{
    									kennz++;
    									strcpy(client.cJob,cJob);
    									strcpy(client.cDate,cDatum);
    									strcpy(client.cTime,cZeit);
    									strcpy(error,"");
    								}
    								else
    								{
    									break;
    								}
    							}
    							if(kennz==0)
    							{
    								strcpy(error,"Fehler: Keine Datensätze vorhanden");
    							}
    						}
    						else
    						{
    							strcpy(error,"Fehler: Bitte prüfen Sie die Parameter");
    						}
    					}
    					else
    					{
    						strcpy(error,"Fehler: Bitte prüfen Sie die Parameter");
    					}
    					//---------------------------------------------------------------------------------
    					SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
    				}
    				else
    				{
    					strcpy(error,"Fehler: Konnte die ODBC Datenquelle nicht finden.");
    				}
    				SQLDisconnect(hdbc);
    			}
    			SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    		}
    	}
    	query=0;
    
    	SQLFreeHandle(SQL_HANDLE_ENV, henv);
    
    	kennz=0;
    
    	return 0;
    }
    
    int LoadParameters(HWND hwnd)
    {
    	char *temp;
    
    	temp=(char *)malloc(660);
    
    	GetPrivateProfileString("ODBC","Name","",temp,66000,cPfad);
    	strcpy(client.cName,temp);
    
    	GetPrivateProfileString("ODBC","SQL","",temp,66000,cPfad);
    	strcpy(client.cSQL,temp);
    
    	GetPrivateProfileString("ODBC","User","",temp,66000,cPfad);
    	strcpy(client.cUser,temp);
    
    	GetPrivateProfileString("ODBC","Passwd","",temp,66000,cPfad);
    	strcpy(client.cPasswort,temp);
    
    	GetPrivateProfileString("ODBC","Periode","30",temp,66000,cPfad);
    	strcpy(client.cPeriode,temp);
    
    	free(temp);
    
    	return 0;
    }
    
    BOOL CALLBACK InfoProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
    {
    	switch(Message)
    	{
    		case WM_INITDIALOG:
    		break;
            case WM_COMMAND:
    			switch(LOWORD(wParam))
    			{
    				case IDC_OK:
    					EndDialog(hwnd,IDOK);
    				break;
                }
            break;
            default:
                return FALSE;
        }
    	return quit;
    }
    


  • Ich denke, dass du den Fehler in GetData suchen musst - dort reservierst du dir ja jedesmal recht viel Speicher



  • leider nicht. hab es mal auskommentiert. bei jeder WM_TIMER erhöht sich er speicher um 4k


Anmelden zum Antworten