У меня есть программа, которая должна использовать 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 должен использовать X = 793 И Y = 866 для verde
функцию, а затем использовать х = 803 у = 796 для amarelo
функция
Простой ответ на ваш вопрос заключается в том, что вы можете позвонить 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);
Других решений пока нет …