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);
}
}
процессы и потоки...
На тему процессов и потоков (ф-ции CreateProcess , CreateThread, и т.д.)
Конкретней - написать программку, в консоле, которая выводит сортировку массива случай. чисел с отображением хода (програсса) в процентах, и чтобы можно было отменить слишком долгую операцию...
Есть конечно еще пару вопросов, но пока меня это интересует...
"Собрал" стандартный пузырьковой алгоритм сортировки... Разобрал ф-ции CreateProcess и CreateThread(вроде понятны все параметры и т..д.), только вот никак не пойму, как все это использовать в конкретной задаче? Посоветуйте хотя бы, с чего начать?
запускаеш функцию сортировки как поток. Делаеш глобальную переменную в которой будет хранится процент сделанной работы. Поток сортировки будет это число переодически менять. Основная програма будет это число переодически читать и соответственно отображать.
Чуть сложнее определить процент завершенности сортировки. У Тебя алгоритм сортировки пузырьковый. Можно определять процент завершенности таким методом: при проходе всех чисел записывать адрес последнего переставленого елемента, тогда процент завершенности будет:
(ДлинаМас-ПозицияПослПерест)/ДлинаМас
Разобрался только с параметрами функций, но не пойму как привязывать к пользовательской функции.....
что нужно точно сделать, стало более менее ясно...
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`шника, который будет использовать первый, и с помощью которого мы будем измерять время сортировки в зависимости от размера массива....но пока мне нужно понять как сделать первый модуль...
мдя........ уважаемые программисты......а всего лишь студенческая задачка...
Цитата:
Originally posted by JJohn
мдя........ уважаемые программисты......а всего лишь студенческая задачка...
мдя........ уважаемые программисты......а всего лишь студенческая задачка...
ГАГАГА :D, на себя посмотри, да??
Код:
итакс.... 1-ый модуль сотворен... все прекрасно работает...- это консольная прога.... есть второй модуль (неконсольный). В нем запускаю с помощью КриэйтПроцесс 1 модуль с нужными с нужными "флагами"....
1) Возможно ли в этом(GUI) модуле использовать как-нибудь переменные консольного модуля? (например там работает прогресс бар, который в сортировки "крутится", а хотелось бы, чтобы он был и в оконном приложении параллельно, так как в этом режиме, КриэйтПроцесс запускает консольное приложение в свернутом состоянии (Hide) )
2) Как "поймать" факт нажатия кнопки? С консолью было все просто.... Тут же даже попробовав использовать глобальные переменные, ничего не получается, все равно все "зависает" и не дает нажать на кнопку... (так как вэйтфосинглобджект потока функции какой-то ждет завершения этого потока, а вэйт функции например Cancel также зацикливается, ожидая перестановки шлафка глобаль переменной например в true, что происходит в кнопке...)
Цитата:
Originally posted by JJohn
Alexandoros, Насчет критических секций, совсем неподошло, сделал по-другому...
итакс.... 1-ый модуль сотворен... все прекрасно работает...- это консольная прога.... есть второй модуль (неконсольный). В нем запускаю с помощью КриэйтПроцесс 1 модуль с нужными с нужными "флагами"....
1) Возможно ли в этом(GUI) модуле использовать как-нибудь переменные консольного модуля? (например там работает прогресс бар, который в сортировки "крутится", а хотелось бы, чтобы он был и в оконном приложении параллельно, так как в этом режиме, КриэйтПроцесс запускает консольное приложение в свернутом состоянии (Hide) )
2) Как "поймать" факт нажатия кнопки? С консолью было все просто.... Тут же даже попробовав использовать глобальные переменные, ничего не получается, все равно все "зависает" и не дает нажать на кнопку... (так как вэйтфосинглобджект потока функции какой-то ждет завершения этого потока, а вэйт функции например Cancel также зацикливается, ожидая перестановки шлафка глобаль переменной например в true, что происходит в кнопке...)
Alexandoros, Насчет критических секций, совсем неподошло, сделал по-другому...
итакс.... 1-ый модуль сотворен... все прекрасно работает...- это консольная прога.... есть второй модуль (неконсольный). В нем запускаю с помощью КриэйтПроцесс 1 модуль с нужными с нужными "флагами"....
1) Возможно ли в этом(GUI) модуле использовать как-нибудь переменные консольного модуля? (например там работает прогресс бар, который в сортировки "крутится", а хотелось бы, чтобы он был и в оконном приложении параллельно, так как в этом режиме, КриэйтПроцесс запускает консольное приложение в свернутом состоянии (Hide) )
2) Как "поймать" факт нажатия кнопки? С консолью было все просто.... Тут же даже попробовав использовать глобальные переменные, ничего не получается, все равно все "зависает" и не дает нажать на кнопку... (так как вэйтфосинглобджект потока функции какой-то ждет завершения этого потока, а вэйт функции например Cancel также зацикливается, ожидая перестановки шлафка глобаль переменной например в true, что происходит в кнопке...)
Ясен хрен не подошло если ты через процесы делал. Критикал секции только для ВНУТРИПРОЦЕССНОЙ синхронизации. Если сделаеш все в одном процесе - как написано выше, то все и будет работать. А если хочеш через два проецеса делать - то тебе обмен нада через пайпы организовывать, и вообще - через 2 процеса ты себе тока трудностей на жопу придумаеш, делай в одном. Хотя если надо - то или пайпы или сокеты, и мутексы вместо критсекций.
Цитата:
Originally posted by Alexandoros
Хотя если надо - то или пайпы или сокеты, и мутексы вместо критсекций.
Хотя если надо - то или пайпы или сокеты, и мутексы вместо критсекций.
ну ты поругался :))