Простой ответ на ваш вопрос заключается в том, что вы можете позвонить по номеру 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);
Тогда просто сделайте это. Вызовите 'GetPixel()' снова с новыми значениями. Не работает ли это? – andlabs
не нужно было бы объявлять другой int red и int green ...? как int reda просто передать новое значение? Разве это не создало бы ненужное использование памяти? –
Звоните «GetPixel» в функции потоков вместо внешнего, я имею в виду функции «verde» и «amarelo». с вашими разными значениями x, y. – Naidu