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

Ваш аккаунт

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

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

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

процессы и потоки...

9.6K
19 октября 2005 года
JJohn
15 / / 16.09.2005
Ребята... Есть такая проблемка...

На тему процессов и потоков (ф-ции CreateProcess , CreateThread, и т.д.)
Конкретней - написать программку, в консоле, которая выводит сортировку массива случай. чисел с отображением хода (програсса) в процентах, и чтобы можно было отменить слишком долгую операцию...
Есть конечно еще пару вопросов, но пока меня это интересует...
"Собрал" стандартный пузырьковой алгоритм сортировки... Разобрал ф-ции CreateProcess и CreateThread(вроде понятны все параметры и т..д.), только вот никак не пойму, как все это использовать в конкретной задаче? Посоветуйте хотя бы, с чего начать?
292
21 октября 2005 года
Matush
726 / / 14.01.2004
Если Ты разобрался с потоками, то реализация проста:
запускаеш функцию сортировки как поток. Делаеш глобальную переменную в которой будет хранится процент сделанной работы. Поток сортировки будет это число переодически менять. Основная програма будет это число переодически читать и соответственно отображать.
Чуть сложнее определить процент завершенности сортировки. У Тебя алгоритм сортировки пузырьковый. Можно определять процент завершенности таким методом: при проходе всех чисел записывать адрес последнего переставленого елемента, тогда процент завершенности будет:
(ДлинаМас-ПозицияПослПерест)/ДлинаМас
9.6K
28 октября 2005 года
JJohn
15 / / 16.09.2005
Matush
Разобрался только с параметрами функций, но не пойму как привязывать к пользовательской функции.....

что нужно точно сделать, стало более менее ясно...
1) что нужно сделать первым, так это создать exe`шник, являющейся консольной программой.
этот модуль должен производить сортировку большого массива(пользуемся "пузырьком", так как самый медленный способ). Массив выделяться должен динамически(для того чтобы в командной строке можно было передавать его размер)
еще указано, что в режиме "по умолчанию" - производится вывод на экран, то есть режим пользователя, а в режиме "silent mode" не производится вывод на экран.
Это обязательное условие того, что нужно сделать...
Вот что удалось понять......
Здесь должен создаваться поток(CreateThread), который и будет выполнять сортировку..,
а в интерфейсной части что-то типа этого:
//interface
while(1) {
...
res=WaitForSingleObject(hSort,0);
...
if (res==WAIT_OBJECT_0)
{
...//exit Program
}

} //while

Так вот я не пойму, как именно правильно организовать поток с функцией сортировки.
и еще не совсем понятно, как можно с помощью выше приведенного куска кода организовать то, чтобы можно было прервать нажатием клавиши например, длительную операцию(если допустим мы ввели слишком большой размер массива)
Сама сортировка производится, но без потока.....:
Нечто типа:
for n:=0 to 999 do
for i:=0 to 999 do
if Massiv>Massiv[i+1] then begin
buf:=Massiv[i+1];
Massiv[i+1]:=Massiv;
Massiv:=buf;
end;
программе в консоле передается параметр размера. Это создано специально для организации второго консолного exe`шника, который будет использовать первый, и с помощью которого мы будем измерять время сортировки в зависимости от размера массива....но пока мне нужно понять как сделать первый модуль...
9.6K
31 октября 2005 года
JJohn
15 / / 16.09.2005
мдя........ уважаемые программисты......а всего лишь студенческая задачка...
398
01 ноября 2005 года
Alexandoros
630 / / 21.10.2005
Цитата:
Originally posted by JJohn
мдя........ уважаемые программисты......а всего лишь студенческая задачка...


ГАГАГА :D, на себя посмотри, да??

Код:
int indicator;
int fl_Out;
CRITICAL_SECTION crit;

int main(...)
{
    fl_Out = 0;
   InitializeCriticalSection(&Sect);

   CreateThread(Pusirek,....);
   CreateThread(OtobrasitIndicatorNaConsole....);    
   getchе(); // тут мы выйдем из програмы

   DeleteCriticalSection(&Sect);
   ExitProcess(0);

}

void Pusirek()
{
    // итерация сортировки
    EnterCriticalSection(&Sect);
     indicator = (ДлинаМас-ПозицияПослПерест)/ДлинаМас;
    LeaveCriticalSection(&Sect);
 

     //////////////////////
    // Выход
     EnterCriticalSection(&Sect);
     fl_Out = 1;
    LeaveCriticalSection(&Sect);  
}

void OtobrasitIndicatorNaConsole()
{
  for(;;)
  {
     
     EnterCriticalSection(&Sect);

     printf("%d", indicator);

     if(fl_Out)
       return;

     LeaveCriticalSection(&Sect);
     
     Sleep(1000);
  }

}
9.6K
04 ноября 2005 года
JJohn
15 / / 16.09.2005
Alexandoros, Насчет критических секций, совсем неподошло, сделал по-другому...


итакс.... 1-ый модуль сотворен... все прекрасно работает...- это консольная прога.... есть второй модуль (неконсольный). В нем запускаю с помощью КриэйтПроцесс 1 модуль с нужными с нужными "флагами"....
1) Возможно ли в этом(GUI) модуле использовать как-нибудь переменные консольного модуля? (например там работает прогресс бар, который в сортировки "крутится", а хотелось бы, чтобы он был и в оконном приложении параллельно, так как в этом режиме, КриэйтПроцесс запускает консольное приложение в свернутом состоянии (Hide) )
2) Как "поймать" факт нажатия кнопки? С консолью было все просто.... Тут же даже попробовав использовать глобальные переменные, ничего не получается, все равно все "зависает" и не дает нажать на кнопку... (так как вэйтфосинглобджект потока функции какой-то ждет завершения этого потока, а вэйт функции например Cancel также зацикливается, ожидая перестановки шлафка глобаль переменной например в true, что происходит в кнопке...)
398
04 ноября 2005 года
Alexandoros
630 / / 21.10.2005
Цитата:
Originally posted by JJohn
Alexandoros, Насчет критических секций, совсем неподошло, сделал по-другому...


итакс.... 1-ый модуль сотворен... все прекрасно работает...- это консольная прога.... есть второй модуль (неконсольный). В нем запускаю с помощью КриэйтПроцесс 1 модуль с нужными с нужными "флагами"....
1) Возможно ли в этом(GUI) модуле использовать как-нибудь переменные консольного модуля? (например там работает прогресс бар, который в сортировки "крутится", а хотелось бы, чтобы он был и в оконном приложении параллельно, так как в этом режиме, КриэйтПроцесс запускает консольное приложение в свернутом состоянии (Hide) )
2) Как "поймать" факт нажатия кнопки? С консолью было все просто.... Тут же даже попробовав использовать глобальные переменные, ничего не получается, все равно все "зависает" и не дает нажать на кнопку... (так как вэйтфосинглобджект потока функции какой-то ждет завершения этого потока, а вэйт функции например Cancel также зацикливается, ожидая перестановки шлафка глобаль переменной например в true, что происходит в кнопке...)



Ясен хрен не подошло если ты через процесы делал. Критикал секции только для ВНУТРИПРОЦЕССНОЙ синхронизации. Если сделаеш все в одном процесе - как написано выше, то все и будет работать. А если хочеш через два проецеса делать - то тебе обмен нада через пайпы организовывать, и вообще - через 2 процеса ты себе тока трудностей на жопу придумаеш, делай в одном. Хотя если надо - то или пайпы или сокеты, и мутексы вместо критсекций.

9.6K
04 ноября 2005 года
JJohn
15 / / 16.09.2005
Цитата:
Originally posted by Alexandoros
Хотя если надо - то или пайпы или сокеты, и мутексы вместо критсекций.



ну ты поругался :))

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог