drakoo Temat założony przez niniejszego użytkownika |
[Winapi]Rysowanie obiektów z użyciem wątków » 2014-01-24 19:44:46 Witam, Posiadam bibliotekę dll z funkcją rysującą w oknie losowo wybrane figury geometryczne o losowych parametrach: #include "stdafx.h" #include <Windows.h> #include <tchar.h> #include <cstdlib> #include <ctime> #include <process.h>
using namespace std;
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; }
void __cdecl CPP_Function( int l_obiektow, HINSTANCE hInstance, HWND output ) { srand( time( NULL ) ); int ix, figura; int tablica[ 8 ] = { 0x808080, 0x00FF00, 0x0000FF, 0x00FFFF, 0xFF00FF, 0xFFFF00, 0x008080, 0x800080 }; int tablica2[ 3 ] = { 0, 1, 2 }; for( ix = 0; ix < l_obiektow; ix++ ) { int figura =( rand() % 3 ); if( tablica2[ figura ] == 0 ) { int kolor =( rand() % 8 ); int rx =( rand() % 801 ); int ry =( rand() % 551 ) + 50; int rhx =( rand() % 801 ); int rwy =( rand() % 551 ) + 50; HDC hdcOkno = GetDC( output ); HBRUSH PedzelZiel, Pudelko; HPEN OlowekCzerw, Piornik; PedzelZiel = CreateSolidBrush( tablica[ kolor ] ); OlowekCzerw = CreatePen( PS_SOLID, 1, tablica[ kolor ] ); Pudelko =( HBRUSH ) SelectObject( hdcOkno, PedzelZiel ); Piornik =( HPEN ) SelectObject( hdcOkno, OlowekCzerw ); Rectangle( hdcOkno, rhx, rwy, rx, ry ); SelectObject( hdcOkno, Pudelko ); SelectObject( hdcOkno, Piornik ); DeleteObject( OlowekCzerw ); DeleteObject( PedzelZiel ); ReleaseDC( output, hdcOkno ); } if( tablica2[ figura ] == 1 ) { int kolor =( rand() % 8 ); int rx =( rand() % 801 ); int ry =( rand() % 551 ) + 50; int rhx =( rand() % 801 ); int rwy =( rand() % 551 ) + 50; HDC hdcOkno = GetDC( output ); HBRUSH PedzelZiel, Pudelko; HPEN OlowekCzerw, Piornik; PedzelZiel = CreateSolidBrush( tablica[ kolor ] ); OlowekCzerw = CreatePen( PS_SOLID, 1, tablica[ kolor ] ); Pudelko =( HBRUSH ) SelectObject( hdcOkno, PedzelZiel ); Piornik =( HPEN ) SelectObject( hdcOkno, OlowekCzerw ); Ellipse( hdcOkno, rhx, rwy, rx, ry ); SelectObject( hdcOkno, Pudelko ); SelectObject( hdcOkno, Piornik ); DeleteObject( OlowekCzerw ); DeleteObject( PedzelZiel ); ReleaseDC( output, hdcOkno ); } if( tablica2[ figura ] == 2 ) { int kolor =( rand() % 8 ); int rx =( rand() % 801 ); int ry =( rand() % 551 ) + 50; int rhx =( rand() % 801 ); int rwy =( rand() % 551 ) + 50; int rtx =( rand() % 801 ); int rty =( rand() % 551 ) + 50; POINT Wierzch[ 3 ]; Wierzch[ 0 ].x = rx; Wierzch[ 0 ].y = ry; Wierzch[ 1 ].x = rhx; Wierzch[ 1 ].y = rwy; Wierzch[ 2 ].x = rtx; Wierzch[ 2 ].y = rty; HDC hdcOkno = GetDC( output ); HBRUSH PedzelZiel, Pudelko; HPEN OlowekCzerw, Piornik; PedzelZiel = CreateSolidBrush( tablica[ kolor ] ); OlowekCzerw = CreatePen( PS_SOLID, 1, tablica[ kolor ] ); Pudelko =( HBRUSH ) SelectObject( hdcOkno, PedzelZiel ); Piornik =( HPEN ) SelectObject( hdcOkno, OlowekCzerw ); Polygon( hdcOkno, Wierzch, 3 ); SelectObject( hdcOkno, Pudelko ); SelectObject( hdcOkno, Piornik ); DeleteObject( OlowekCzerw ); DeleteObject( PedzelZiel ); ReleaseDC( output, hdcOkno ); } } }
Funkcje wczytuje za pomocą: HMODULE dllload; dllload = LoadLibrary( "CPP-DLL.dll" ); if( !dllload ) { MessageBox( output, "Błąd, Nie wczytano DLL", "", 0 ); return; } FARPROC loadfunctiondll = GetProcAddress( dllload, "CPP_Function" ); if( !loadfunctiondll ) { MessageBox( output, "Błąd, Nie wczytano Funkcji", "", 0 ); return; }
int waatki = 2;
int lwatki; int liczba_rysowanych_ksztaltow = 1000; lwatki = liczba_ksztaltow + 1;
typedef void( * wzor )( int, HINSTANCE, HWND ); wzor funkcja = wzor( loadfunctiondll );
if( lwatki == 1 ) { liczba_rysowanych_ksztaltow = 1000; } if( lwatki == 2 ) { liczba_rysowanych_ksztaltow = 5000; } if( lwatki == 3 ) { liczba_rysowanych_ksztaltow = 20000; } czas_start = clock(); funkcja( liczba_rysowanych_ksztaltow, output_hinstance, output ); czas_stop = clock(); czas_wynik =(( czas_stop - czas_start ) ); stringstream stream; stream << czas_wynik / CLOCKS_PER_SEC; SendMessage( czas_text, WM_SETTEXT, 0,( LPARAM ) stream.str().c_str() );
W jaki sposób zrobić by, gdy z menu wybiorę ilość wątków równą np. 4 oraz ilość rysowanych figur równą 1000, program równocześnie w czterech wątkach rysował figury, natomiast gdy w jednym z nich skończył rysować daną figurę przechodził do rysowania kolejnej tak długo, aż zostaną narysowane wszystkie figury. Pozdrawiam |