Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2012, 10:22   #1
Музыкант
Пользователь
 
Регистрация: 15.11.2011
Сообщений: 26
По умолчанию после sleep не хочет работать

здравствуйте. делаю обход графа, и, чтоб наглядно было, делаю sleep, но после того, как он все обошел, не хочет выдаваться ShowMessage('Обход завершен.'); и программа работает как -то заторможенно, но работает, а закрыть ее не получается. Причем если, например у меня 7 вершин и 7 ребер, то все нормалньо работает, а если ребер 21, то уже не работает
Помогите, очень надо
Код:
procedure dfs(v: integer;visited:masbool);
var
  i: integer;
begin
  visited[v] := true;
  shape[v].Brush.Color:=clRed;
  for i := 1 to n do
    if ((matr[v, i]<>-1) and (not visited[i])) then
      begin
        sleep(100);
        Application.ProcessMessages;
        dfs(i,visited);
      end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  visited: masbool;
begin
  fillchar(visited,sizeof(visited),0);
  dfs(1,visited);
  ShowMessage('Обход завершен.');
end;
Музыкант вне форума Ответить с цитированием
Старый 03.12.2012, 10:30   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

думаю, что при увеличении количества ребёр проявляются другие проблемы, связанные с резким увеличением вложенности и количества вычислений.

Вот, если закомментировать Sleep() - всё работает нормально? (если нет, тогда проблема явно не в Sleep...)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.12.2012, 11:40   #3
Музыкант
Пользователь
 
Регистрация: 15.11.2011
Сообщений: 26
По умолчанию

да, если sleep закомментить, то все нормально работает.
если поставить Sleep(1), то через некоторое время ShowMessage('Обход завершен.'); появляется
Музыкант вне форума Ответить с цитированием
Старый 03.12.2012, 14:51   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Ну так теперь она работает так, как ты хочешь?
s-andriano вне форума Ответить с цитированием
Старый 03.12.2012, 15:18   #5
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

А если так

Код:
procedure dfs(v: integer;visited:masbool);
var
  i,ii: integer;
begin
  visited[v] := true;
  shape[v].Brush.Color:=clRed;
  for i := 1 to n do
    if ((matr[v, i]<>-1) and (not visited[i])) then
      begin
        for ii := 1 to 1000 do
        Application.ProcessMessages;
        dfs(i,visited);
      end;
end;
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 03.12.2012, 15:52   #6
Музыкант
Пользователь
 
Регистрация: 15.11.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Ну так теперь она работает так, как ты хочешь?
нет, Sleep(1) глазу ведь незаметная задержка, а если Sleep(500), например, поставить, то не работает
Музыкант вне форума Ответить с цитированием
Старый 03.12.2012, 15:56   #7
Музыкант
Пользователь
 
Регистрация: 15.11.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от BARNEY Посмотреть сообщение
А если так

Код:
procedure dfs(v: integer;visited:masbool);
var
  i,ii: integer;
begin
  visited[v] := true;
  shape[v].Brush.Color:=clRed;
  for i := 1 to n do
    if ((matr[v, i]<>-1) and (not visited[i])) then
      begin
        for ii := 1 to 1000 do
        Application.ProcessMessages;
        dfs(i,visited);
      end;
end;
если в вашем цикле поставить не 1000(потому что опять глазу не заметна эта задержка), а 1000000, то опять прога зависает
Музыкант вне форума Ответить с цитированием
Старый 03.12.2012, 16:03   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
если в вашем цикле поставить не 1000(потому что опять глазу не заметна эта задержка), а 1000000, то опять прога зависает
Ну а почему ей не зависнуть? 1000 секунд прога не будет реагировать на любые действия и так в цикле. Полный абзац
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.12.2012, 16:30   #9
Музыкант
Пользователь
 
Регистрация: 15.11.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну а почему ей не зависнуть? 1000 секунд прога не будет реагировать на любые действия и так в цикле. Полный абзац
не надо с больной головы на здоровую - где тут про 1000 секунд говорится?
одна итерация цикла никак не может секунду длится, и даже от 1 до 1000000 в разы меньше секунды будет.
Музыкант вне форума Ответить с цитированием
Старый 03.12.2012, 17:33   #10
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Цитата:
и программа работает как -то заторможенно
Еще бы, каждую итерацию программа засыпает на 100 мс.

Цитата:
а если ребер 21, то уже не работает
Не работает? Точно в этом уверены? Что показывает отладка? Может быть вычисления идут долго...
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа не хочет работать OperaNeMini Софт 15 02.12.2012 16:24
Не хочет работать таймер gmmjob C# (си шарп) 1 05.06.2012 07:44
Сортировка не хочет работать :( Авторитет Общие вопросы C/C++ 1 05.05.2011 21:10
fabs() не хочет работать Razza Общие вопросы C/C++ 2 28.12.2010 02:21
ну не хочет работать!!! MySQL artush1984 Общие вопросы C/C++ 1 06.09.2009 13:41