Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Winapi]Rysowanie obiektów z użyciem wątków

Ostatnio zmodyfikowano 2014-02-18 12:22
Autor Wiadomość
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:
C/C++
#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;
}

/*int PrintNumber(int nNumber, HWND output)
{
_TCHAR szBuffer[100];
int gg = nNumber;
wsprintf(szBuffer, _T("%d"), nNumber);
return MessageBox(output, szBuffer, _T("wat"), MB_OK);
}

int test(int czas){
int zczas = czas;
return zczas;
}*/

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ą:

C/C++
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;
//waatki = ilosc +1;

/*HANDLE hThread = (HANDLE)_beginthread((void(__cdecl*)(void*))loadfunctiondll, 0, NULL);
Sleep(5000);*/

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
P-103104
drakoo
Temat założony przez niniejszego użytkownika
» 2014-02-17 19:33:43
@up

Ktoś jest w stanie pomóc?
P-104808
Admixior
» 2014-02-18 03:10:09
Nie wiem do końca czy w tym tkwi problem.
Najłatwiej (tak mi się wydaje) zrobić coś takiego:
1. Globalna tablica int'ów przechowująca stan pracy wątków (czy jeszcze pracują) (np. -1 to wątek oczekuje na prace, -2 wątek kończy prace, a jak wartość dodatnia to rysuje figurę o tym numerze)
2. Jeden wątek będzie nadzorował prace pozostałych i gdy jakiś skończy prace to daje mu następną (chyba że już nie ma to ustawia na -2)
P-104854
DejaVu
» 2014-02-18 12:22:39
Nie rysuj niczego za pomocą wielu wątków. Jeden wątek ma rysować wszystko.
P-104866
« 1 »
  Strona 1 z 1