我有一个程序可以使用GetPixel,但是在不同的位置,在读取一个值并进行评估之后,它必须改变x,y位置并重新评估另一个函数的值。 我有当前的代码:
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应该对verde
函数使用X = 793和Y = 866,然后对amarelo
函数使用x = 803 y = 796
答案 0 :(得分:1)
您问题的简单答案是,您可以使用不同的坐标多次调用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);
然而,话虽如此,你的线程浪费了开销。在启动第二个线程之前,您的循环被阻塞,等待第一个线程完成,并且在进入下一个循环迭代之前被阻塞等待第二个线程完成。您正在以序列化方式运行代码,从而破坏了使用线程的目的,因此您可以完全删除线程并直接调用函数:
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);