Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Процессы (С++ под Windows)

48K
27 сентября 2009 года
Riorden
4 / / 31.05.2009
Здравствуйте. Нужно сделать небольшую программу под windows с использованием процессов. Процесс должен выводить на консоль цифры начиная с 1 и заканчивая n, с задержкой в 1 сек. N задается до начала выполнения процесса. Должна присутствовать возможность остановки процесса.
Выглядеть должно примерно так:
Включаем программу->вводим число-запускается процесс(во время работы будет выглядеть как 1 2 3 4 5 ....)->нажимаем некую клавишу(допустим 1) и процесс перестает выводить цифры.

PS: Программа простенькая, но совершенно не разбираюсь в процессах, может быть кто-нибудь подскажет где можно об этом почитать.
842
27 сентября 2009 года
sigmov
301 / / 16.09.2008
Цитата: Riorden
PS: Программа простенькая, но совершенно не разбираюсь в процессах, может быть кто-нибудь подскажет где можно об этом почитать.



Я так понял, автор темы имеет ввиду под "процессом" Поток.
Процессы тут не при чем.

Прочитайте С++ многопоточность
http://www.cyberguru.ru/programming/cpp/multithreading-intro.html

42K
28 сентября 2009 года
machgun
25 / / 02.01.2009
Ищи инфу в MSDN и google на что?

Общая схема такая:

Код:
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
{
DWORD dwThread[100];
HANDLE hThread[100];
int i, trid = 0;
unsigned char param[1000];

while (trid < 100)
{
hThread[trid] = CreateThread(NULL,0,threadwork,param+trid,0,&dwThread[trid]);
trid++;
}

for (i = 0;i < trid;i++) {
    WaitForSingleObject(hThread,INFINITE);
    CloseHandle(hThread);
    }

return 0;
}

DWORD CALLBACK threadwork (char *argv)
{
// код потока
return 0;
}
602
28 сентября 2009 года
KPI Student
265 / / 16.12.2006
Цитата: sigmov
Я так понял, автор темы имеет ввиду под "процессом" Поток.
Процессы тут не при чем.


Может, задание состоит в том, чтобы вывод в консоль выполнялся из дочернего процесса. Вполне может быть.

Тогда читать MSDN на тему CreateProcess, и гуглить на "синхронизация процессов в windows".

А еще лучше почитать книжку ( даже на русском:) ) "Рихтер Дж. — Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows". Там все просто, полезно и понятно.

278
29 сентября 2009 года
Alexander92
1.1K / / 04.08.2008
Цитата: machgun
Ищи инфу в MSDN и google на что?

Общая схема такая:

 
Код:
// ...
hThread[trid] = CreateThread(NULL,0,threadwork,param+trid,0,&dwThread[trid]);
//...
DWORD CALLBACK threadwork (char *argv) {
// ...
}



Вот здесь вы немножко неправы, в общей схеме функция threadwork должна принимать указатель на void:

 
Код:
// ...
char *func_param = param + trid;
hThread[trid] = CreateThread(NULL, 0, threadwork, (void *)func_param, 0, &dwThread[trid]);
// ...
DWORD WINAPI threadwork(void *argv) {
   char *some_string = (char *)argv;
   //...
}
48K
01 октября 2009 года
Riorden
4 / / 31.05.2009
Цитата: KPI Student
Может, задание состоит в том, чтобы вывод в консоль выполнялся из дочернего процесса. Вполне может быть.

Тогда читать MSDN на тему CreateProcess, и гуглить на "синхронизация процессов в windows".

А еще лучше почитать книжку ( даже на русском:) ) "Рихтер Дж. — Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows". Там все просто, полезно и понятно.



Так и есть, и немного перепутал должно быть 2 процесса. 1 выводит начиная с 1 до n, а второй в обратном порядке, в другой половине консоля. Выводить должны одноврменно. Каким образом это можно ссинхронизирировать?

602
01 октября 2009 года
KPI Student
265 / / 16.12.2006
В другой половине консоли?! Это обязательно?

Думаю, проще всего мьютексами. Как - подробно описано у Рихтера, у гугла ("синхронизация процессов в windows"), и в MSDN на тему "mutex objects". Что не понятно - спрашивайте.
48K
01 октября 2009 года
Riorden
4 / / 31.05.2009
Ну допустим просто сделать 2 процесса выводящих числа.
в 1 строчке консоля выводит от 1 до 10
во второй строчке консоля от 10 до 1

Не представляю(даже теоретически) как синхронизировтаь такое дело... Информации о мьютексах конечно много, но что-то не могу найти примеров в виде выполнения несколких одновременных задач.
Единственное что приходит на ум: Создается 2 процесса(представляют собой циклы вывода цифр). Далее каким то оброзом с помощью мьбютексов, сначало выводится 1 цифра в первой строке, перескакиваем на вторую строку, выводим символ из процесса 2 и т.д.
602
01 октября 2009 года
KPI Student
265 / / 16.12.2006
Цитата: Riorden
Далее каким то оброзом с помощью мьбютексов, сначало выводится 1 цифра в первой строке, перескакиваем на вторую строку, выводим символ из процесса 2 и т.д.



Ничего у вас спомощью мьютексов не будет выводиться. А вот синхронизоваться - да.

Никогда не интересовался компиляторо-зависимым форматированием в консоли, а вот синхронизацию можно сделать так:

Код:
void output1()
{
    HANDLE hMutex = ::CreateMutex(NULL/*lpMutexAttributes*/,bInitialOwner, lpMutexName);

    for ( size_t i=0; i<50; i++ )
    {
        CGuard lock ( hMutex ); // занимаем блокировку, чтобы выводить в консоль монопольно
       
        // вывод в консоль
        cout << i << "; ";
    }
}

void output2()
{
    HANDLE hMutex = ::CreateMutex(NULL/*lpMutexAttributes*/,bInitialOwner, lpMutexName);

    for ( size_t i=50; i>0; i-- )
    {
        CGuard lock ( hMutex ); // занимаем блокировку, чтобы выводить в консоль монопольно
       
        // вывод в консоль
        cout << i << "; ";
    }
}


/* класс для блокировки-разблокировки. Преимужество то же, что и
    в смарт-поинтерах, вам не нужно беспокоиться об освобождении
    объёкта: он будет освобожден при выходе из области видимости
    *даже* если возникнет исключение.
        Иначе при использовании нескольких точек выхода из функции и
    исключений получите кучу гемороя следить где что надо освободить */
class CGuard
{
public:
    CGuard( HANDLE handleToLock )
     : m_mutex( handleToLock )
    {
        // занимаем мьютекс, если он уже занят - принудительное ожидание
        ::WaitForSingleObject( m_mutex, INFINITE );
    }

    ~CGuard( )
    {
        // освобождаем мьютекс, чтобы ег омог занять другой процесс/поток
        ::ReleaseMutex( m_mutex );
    }

private:
    HANDLE m_mutex;
};


}



То есть - прямо перед началом использования общего ресурса занимаем мьютекс, чтобы использовать его монопольно, после того, как "использовали" - освобождаем блокировку, чтобы другие потоки (или процессы) могли его использовать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог