2016-11-01 2 views
-1

У меня есть программа, которая должна использовать GetPixel, но в разных положениях, после считывания одного значения и оценки его, она должна изменить позиции 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 и у = 866 для функции verde, а затем использовать х = 803 у = 796 для amarelo функции

+2

Тогда просто сделайте это. Вызовите 'GetPixel()' снова с новыми значениями. Не работает ли это? – andlabs

+0

не нужно было бы объявлять другой int red и int green ...? как int reda просто передать новое значение? Разве это не создало бы ненужное использование памяти? –

+1

Звоните «GetPixel» в функции потоков вместо внешнего, я имею в виду функции «verde» и «amarelo». с вашими разными значениями x, y. – Naidu

ответ

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); 
+0

Спасибо! Это действительно решило мою проблему! –

Смежные вопросы