Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Процессы и потоки...


Автор: JJohn 19.10.2005, 22:16
Ребята... Есть такая проблемка...

На тему процессов и потоков (ф-ции CreateProcess , CreateThread, и т.д.)
Конкретней - написать программку, в консоле, которая выводит сортировку массива случай. чисел с отображением хода (програсса) в процентах, и чтобы можно было отменить слишком долгую операцию...
Есть конечно еще пару вопросов, но пока меня это интересует...
"Собрал" стандартный пузырьковой алгоритм сортировки... Разобрал ф-ции CreateProcess и CreateThread(вроде понятны все параметры и т..д.), только вот никак не пойму, как все это использовать в конкретной задаче? Посоветуйте хотя бы, с чего начать?

Автор: Romikgy 20.10.2005, 14:24
ИМХО те хватит одного треда,
Цитата(JJohn @ 19.10.2005, 22:16)
CreateThread

При вызове этой ф-ции , в параметрах указываешь собстно ф-цию потока и в ней делашь почти что хошь smile Только с процентами думаю намаешься, а поток дистанционно можно приостановить или запустить или убить smile

Автор: _hunter 20.10.2005, 14:25
при чем тут процесс -- не понял. если стоит такой вопрос -- зачем тебе CreatеThread?
береш TThread, в Execute пишеш свой алгоритм. после одного пробегания массива ( или еще когда-нить ) выводиш прогресс. паралельно ( не в этом потоке читаеш с консоли и если нужно тормозится -- вызываеш Terminate() потока ( не забывая в нем этот флаг контролировать ) )

Автор: JJohn 28.10.2005, 21:06
итак, что нужно точно сделать, стало более менее ясно... а то раньше сам не совсем понимал, что мне нужно.........
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[i]>Massiv[i+1] then begin
buf:=Massiv[i+1];
Massiv[i+1]:=Massiv[i];
Massiv[i]:=buf;
end;
программе в консоле передается параметр размера. Это создано специально для организации второго консолного exe`шника, который будет использовать первый, и с помощью которого мы будем измерять время сортировки в зависимости от размера массива....но пока мне нужно понять как сделать первый модуль...

Автор: Самурай 28.10.2005, 21:18
А для чего мучаться? Вроде есть формулы, которые отражают "время" сортировки. Оно естественно не может полностью отразить ральный ход вещей, но для процентов очень сгодится. При этом не нужно ничего более, кроме одного приложения с циклом-сортировкой...
Добавлено @ 21:21
А почему использовать нужно именно консоль? В форме более приятно глазам будет отображение. Кстати, в этом случае для лучшего выполнения программы как раз потребуется стандартный поток TThread (или как там пишется).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)