2016-11-01 8 views
-1

私は、GetPixelを使用するプログラムを持っていますが、異なる位置で、値を1つ読み込んで評価した後、x、yの位置を変更して、他の関数の値 私は現在のコードを有する:GetPixel()を使用して異なる位置を確認する方法

while (true) { 
     HDC hDC; 
     hDC = GetDC(NULL); 
     int cx = 793; 
     int cy = 866; 
COLORREF color = GetPixel(hDC, cx, cy); //Use x=793 y=866 
     ReleaseDC(NULL, hDC); 
     RGBTRIPLE rgb; 
     int red = GetRValue(color); 
     int green = GetGValue(color); 
     int blue = GetBValue(color); 
     std::thread t1 (verde, red, green, blue); 
     t1.join(); 
     std::thread t2(amarelo, red, green, blue);//But then here I would like it to read 
     //from let's say x=803 y=796 
     t2.join(); 
} 

問題はgetPixelメソッドは、X = 793を使用しverde関数のY = 866、次いでamarelo機能

+2

それだけです。新しい値で 'GetPixel()'を再度呼び出します。それは動作しませんか? – andlabs

+0

私は別の整数の赤とint緑を宣言する必要はありません...? int redaのような新しい値を渡すだけですか?それは不要なメモリ使用量を作成しませんか? –

+1

スレッド関数の代わりに "GetPixel"を呼び出します。関数 "verde"と "amarelo"を意味します。あなたの異なるx、y値で。 – Naidu

答えて

1

簡単のため、X = 803、Y = 796を使用する必要があるのあなたの質問への答えは、GetPixel()に複数の異なる座標で複数回呼び出すことができるということです。

また、ループの繰り返しごとにGetDC(0)を呼び出す必要はありません。ループに入る前に一度呼び出す必要があります。

これを試してみてください:

COLORREF color; 
int red, green, blue; 

HDC hDC = GetDC(NULL); 
while (some_condition_is_true) { // don't write infinite loops! 
    color = GetPixel(hDC, 793, 866); 
    red = GetRValue(color); 
    green = GetGValue(color); 
    blue = GetBValue(color); 
    std::thread t1(verde, red, green, blue); 
    t1.join(); 

    color = GetPixel(hDC, 803, 796); 
    red = GetRValue(color); 
    green = GetGValue(color); 
    blue = GetBValue(color); 
    std::thread t2(amarelo, red, green, blue); 
    t2.join(); 
} 
ReleaseDC(NULL, hDC); 

しかし、言われていることを、あなたのスレッドが浪費されるオーバーヘッドを。ループはブロックされ、最初のスレッドが完了するのを待ってから2番目のスレッドを開始し、2番目のスレッドが完了するのを待ってから次のループの繰り返しに移ります。あなたは、スレッドを使用しての目的を破って、シリアル化された方法で、あなたのコードを実行しているので、あなたにもちょうど完全にスレッドを削除し、直接関数を呼び出すことがあります。

COLORREF color; 
int red, green, blue; 

HDC hDC = GetDC(NULL); 
while (some_condition_is_true) { 
    color = GetPixel(hDC, 793, 866); 
    red = GetRValue(color); 
    green = GetGValue(color); 
    blue = GetBValue(color); 
    verde(red, green, blue); 

    color = GetPixel(hDC, 803, 796); 
    red = GetRValue(color); 
    green = GetGValue(color); 
    blue = GetBValue(color); 
    amarelo(red, green, blue); 
} 
ReleaseDC(NULL, hDC); 

を使用すると、複数のピクセルを処理するためにスレッドを使用したい場合並行して、それがより次のようになります。

COLORREF color; 
int red, green, blue; 

HDC hDC = GetDC(NULL); 
while (some_condition_is_true) { 
    color = GetPixel(hDC, 793, 866); 
    red = GetRValue(color); 
    green = GetGValue(color); 
    blue = GetBValue(color); 
    std::thread t1(verde, red, green, blue); 

    color = GetPixel(hDC, 803, 796); 
    red = GetRValue(color); 
    green = GetGValue(color); 
    blue = GetBValue(color); 
    std::thread t2(amarelo, red, green, blue); 

    t1.join(); 
    t2.join(); 
} 
ReleaseDC(NULL, hDC); 

、さらには、このように:

void verde(HDC hDC, int x, int y) 
{ 
    COLORREF color; 
    int red, green, blue; 

    while (some_condition_is_true) { 
     color = GetPixel(hDC, x, y); 
     red = GetRValue(color); 
     green = GetGValue(color); 
     blue = GetBValue(color); 
     //... 
    } 
} 

void amarelo(HDC hDC, int x, int, y) 
{ 
    COLORREF color; 
    int red, green, blue; 

    while (some_condition_is_true) { 
     color = GetPixel(hDC, x, y); 
     red = GetRValue(color); 
     green = GetGValue(color); 
     blue = GetBValue(color); 
     //... 
    } 
} 

HDC hDC = GetDC(NULL); 

std::thread t1(verde, hDC, 793, 866); 
std::thread t2(amarelo, hDC, 803, 796); 

t1.join(); 
t2.join(); 

ReleaseDC(NULL, hDC); 
+0

ありがとう!私の問題を本当に解決しました。 –

関連する問題