簡単のため、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);
それだけです。新しい値で 'GetPixel()'を再度呼び出します。それは動作しませんか? – andlabs
私は別の整数の赤とint緑を宣言する必要はありません...? int redaのような新しい値を渡すだけですか?それは不要なメモリ使用量を作成しませんか? –
スレッド関数の代わりに "GetPixel"を呼び出します。関数 "verde"と "amarelo"を意味します。あなたの異なるx、y値で。 – Naidu