Main.cpp
========
Code: Alles auswählen
#define MegaBytes 128
#define MemoryPageSize 1020
#define IDM_EINSTELLUNGEN 100
#define IDM_START 101
#define IDM_STOPP 102
#define IDM_BEENDEN 103
#define IDM_HILFE 104
#define IDT_UPDATE 105
#define IDD_START 200
#define IDD_ENDE 201
#define IDD_SCHRITT 202
#define IDD_TEXT1 203
#define IDD_TEXT2 204
#define IDD_TEXT3 205
#define IDD_OK 206
#include <windows.h>
#include <time.h>
#include <sys/types.h>
#include <sys/timeb.h>
#include <stdio.h>
LRESULT CALLBACK HauptFensterCallBack(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK EinstellungenCallBack(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
HINSTANCE hInst;
int TestStart, TestStop, TestSchritt;
bool Tgestartet, Tanhalten;
long TLesenMS, TLesenKB, TSchreibenMS, TSchreibenKB, Tfortschritt;
char Tstatus1[256];
char Tstatus2[256];
char Tstatus3[256];
HMENU hMenu;
class Memory
{
private:
char *Data;
public:
Memory();
~Memory();
void Anlegen();
void Freigeben();
void Schreiben(char NewData);
int Pruefen(char Data2);
int Pruefen(int Art);
};
Memory::Memory()
{
Data=NULL;
}
Memory::~Memory()
{
if (Data!=(void*)0)
delete Data;
}
void Memory::Anlegen()
{
Data=new char[MemoryPageSize];
}
void Memory::Freigeben()
{
delete Data;
Data=(char*)0;
}
void Memory::Schreiben(char NewData)
{
for (int i=0;i<MemoryPageSize;i++)
Data[i]=NewData;
}
int Memory::Pruefen(char Data2)
{
for (int i=0;i<MemoryPageSize;i++)
if (Data[i]!=Data2)
return -1;
return 0;
}
int Memory::Pruefen(int Art)
{
if (Data!=(void*)0)
{
switch (Art)
{
case 0:
Schreiben((char)0);
break;
case 1:
if (Pruefen((char)0)!=0) return -1;
break;
case 2:
Schreiben((char)85);
break;
case 3:
if (Pruefen((char)85)!=0) return -1;
break;
case 4:
Schreiben((char)170);
break;
case 5:
if (Pruefen((char)170)!=0) return -1;
break;
case 6:
Schreiben((char)255);
break;
case 7:
if (Pruefen((char)255)!=0) return -1;
break;
default:
printf("FEHLER!");
}
}
return 0;
}
DWORD WINAPI test(LPVOID nix)
{
long i;
int Fehlerzahl=0;
_timeb tstruct;
unsigned int temptime;
Memory *Stuff;
for (int size=TestStart;size<TestStop;size+=TestSchritt)
{
TLesenMS=0;
TLesenKB=0;
TSchreibenMS=0;
TSchreibenKB=0;
Tfortschritt=size;
long ende=1024*size;
sprintf(Tstatus1, "Lege %3dMB Speicher an... ", size);
sprintf(Tstatus2, " ");
Stuff= new Memory[ende];
for (i=0;i<ende;i++)
Stuff[i].Anlegen();
for (int PruefTyp=0;PruefTyp<8;PruefTyp++)
{
for (i=0;i<ende;i++)
{
//Zeit Messung starten
_ftime( &tstruct );
temptime=tstruct.millitm+1000*tstruct.time;
if (Stuff[i].Pruefen(PruefTyp)!=0)
{
sprintf(Tstatus3, "SPEICHERFEHLER! (%d) ", ++Fehlerzahl);
}
//Zeit Messung beenden
_ftime( &tstruct );
if (PruefTyp%2==0)
{
TSchreibenKB++;
TSchreibenMS+=tstruct.millitm+1000*tstruct.time-temptime;
}
else
{
TLesenKB++;
TLesenMS+=tstruct.millitm+1000*tstruct.time-temptime;
}
if (i%1024==1023)
{
if (PruefTyp%2==0)
{
sprintf(Tstatus1, "Schreibe %3dMB Speicher...[%d] (%.2fMB/s) ", i/1024+1, PruefTyp/2+1, (float)TSchreibenKB/(float)TSchreibenMS);
sprintf(Tstatus2, " ");
}
else
{
sprintf(Tstatus1, " ");
sprintf(Tstatus2, "Lese %3dMB Speicher...[%d] (%.2fMB/s) ", i/1024+1, PruefTyp/2+1, (float)TLesenKB/(float)TLesenMS);
}
}
if (Tanhalten)
{
for (i=0;i<ende;i++)
Stuff[i].Freigeben();
sprintf(Tstatus1, " ");
sprintf(Tstatus2, "Test beendet. ", size);
Tanhalten=false;
Tgestartet=false;
EnableMenuItem(hMenu, IDM_START, MF_ENABLED);
EnableMenuItem(hMenu, IDM_STOPP, MF_GRAYED);
EnableMenuItem(hMenu, IDM_EINSTELLUNGEN, MF_ENABLED);
return 0;
}
}
}
sprintf(Tstatus1, " ");
sprintf(Tstatus2, "\nGebe %3dMB Speicher frei... ", size);
for (i=0;i<ende;i++)
Stuff[i].Freigeben();
}
sprintf(Tstatus1, " ");
sprintf(Tstatus2, "Test beendet. ", size);
Tgestartet=false;
EnableMenuItem(hMenu, IDM_START, MF_ENABLED);
EnableMenuItem(hMenu, IDM_STOPP, MF_GRAYED);
EnableMenuItem(hMenu, IDM_EINSTELLUNGEN, MF_ENABLED);
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG message;
HACCEL hAccel;
WNDCLASS wc;
wc.style=CS_SAVEBITS;
wc.lpfnWndProc=(WNDPROC)HauptFensterCallBack;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_ERROR);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName="Leer";
wc.lpszClassName="HauptFenster";
if (!RegisterClass(&wc)) exit (1);
hMenu=LoadMenu(hInstance, "HauptMenu");
hWnd=CreateWindow ("HauptFenster", "Testprogramm mit Win32", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 165, NULL, hMenu, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
hAccel=LoadAccelerators(hInstance, "Tasten");
hInst=hInstance;
TestStart=1;
TestStop=512;
TestSchritt=1;
Tgestartet=false;
Tanhalten=false;
TLesenMS=0;
TLesenKB=0;
TSchreibenMS=0;
TSchreibenKB=0;
Tfortschritt=-1;
Tstatus1[0]='\0';
Tstatus2[0]='\0';
Tstatus3[0]='\0';
EnableMenuItem(hMenu, IDM_STOPP, MF_GRAYED);
SetTimer(hWnd, 1234, 125, NULL);
while (GetMessage(&message, NULL, 0, 0))
{
if (!TranslateAccelerator(hWnd, hAccel, &message))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
}
if (Tgestartet==true)
{
Tanhalten=true;
while (Tgestartet==true) Sleep(500);
Sleep(500);
}
return message.wParam;
}
LRESULT CALLBACK HauptFensterCallBack(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
char puffer[256];
switch (message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_EINSTELLUNGEN:
if (Tgestartet==true)
{
MessageBox(hWnd, "Die Einstellungen funktionieren nur, wenn gerade nicht getestet wird!", "Startfehler", MB_OK);
}
else
{
DialogBox(hInst, "Einstellungen", hWnd, (DLGPROC)EinstellungenCallBack);
}
return 0;
case IDM_START:
if (Tgestartet==true)
{
MessageBox(hWnd, "Der Test kann nur einmal gestartet werden!", "Startfehler", MB_OK);
}
else
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)test, NULL, 0, 0);
Tgestartet=true;
EnableMenuItem(hMenu, IDM_START, MF_GRAYED);
EnableMenuItem(hMenu, IDM_STOPP, MF_ENABLED);
EnableMenuItem(hMenu, IDM_EINSTELLUNGEN, MF_GRAYED);
}
return 0;
case IDM_STOPP:
if (Tgestartet==true)
{
Tanhalten=true;
}
else
{
MessageBox(hWnd, "Der Test kann nur angehalten werden, wenn er auch gestartet wurde!", "Startfehler", MB_OK);
}
return 0;
case IDM_BEENDEN:
PostQuitMessage(0);
return 0;
case IDM_HILFE:
MessageBox(hWnd, "Dieses Programm alloziert einfach ein bisschen Speicher, dann ein bisschen mehr und testet damit das System, ob fehler im Arbeitsspeicher vorliegen.\nDas Programm ist v llig frei von irgendwelchen zw ngen, bernimmt aber auch keine Verantwortung f r nix und so.\n\nViel Spa damit!", "Information", MB_OK);
return 0;
}
break;
case WM_TIMER:
hdc=GetDC(hWnd);
if (Tgestartet)
{
sprintf(puffer, "Aktuelle Testgr sse: %dMB (%d-%d)", Tfortschritt, TestStart, TestStop);
TextOut(hdc, 5, 5, puffer, strlen(puffer));
}
TextOut(hdc, 5, 25, Tstatus1, strlen(Tstatus1));
TextOut(hdc, 5, 45, Tstatus2, strlen(Tstatus2));
TextOut(hdc, 5, 65, Tstatus3, strlen(Tstatus3));
ReleaseDC(hWnd, hdc);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
BOOL CALLBACK EinstellungenCallBack(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
char puffer[32];
switch (message)
{
case WM_INITDIALOG:
itoa(TestStart, puffer, 10);
SetDlgItemText(hWnd, IDD_START, puffer);
itoa(TestStop, puffer, 10);
SetDlgItemText(hWnd, IDD_ENDE, puffer);
itoa(TestSchritt, puffer, 10);
SetDlgItemText(hWnd, IDD_SCHRITT, puffer);
return 1;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDD_OK:
GetDlgItemText(hWnd, IDD_START, puffer, 32);
TestStart=atoi(puffer);
GetDlgItemText(hWnd, IDD_ENDE, puffer, 32);
TestStop=atoi(puffer);
GetDlgItemText(hWnd, IDD_SCHRITT, puffer, 32);
TestSchritt=atoi(puffer);
EndDialog(hWnd, 0);
return 1;
}
}
return 0;
}