Программа зависает

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Программа зависает

Сообщение Debugger » 18.07.2006 (Вт) 16:38

Идёт достаточно сложный процесс. Первые 2-3 секунды во время этого процесса всё идёт нормально, потом программа зависает. Организовать при помощи таймера этот процесс не получается, а Slep не помогает. Если решение простое, тапкой не бросаться....

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 18.07.2006 (Вт) 16:41

А какой процес? Код или хотя бы полное описание в студию. А DoEvents не пробовал? Это на вскидку.
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Сообщение Debugger » 18.07.2006 (Вт) 16:50

Ну, типа, есть какой-то кодовый замок. 3 числа. Его загадывает пользователь, а комп отгадывает. Решение искать по очереди комбинацию было убито (а вдруг пользователь загадал 999?), пришлось идти к рандому. Чтобы 2 раза по 1 числу не бил, сделал "резиновый" (растягивающийся) массив, туда записываю пройденные числа. Перве 50 перебирает бодро, потом заметно тормозит и зависает.

Такой же глюк, когда делает колоду карт. Все карты рандомные. Вроде, все 54 карты идут бодро, но ведь их ещё надо и перетасовать!!!

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 18.07.2006 (Вт) 16:58

1. По поводу динамического массива. Производительность повысится, если ты сразу создашь массив на 999 элементов, и просто будешь хранить в переменной № последнего элемента, чем переопределять его постоянно. Хотя, динамический массив, конечно, лучше, но тут не столько элементов, что бы жалеть память.
2. В начале процедуры попробуй поставить DoEvents.
3. Можно на код посмотреть?
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 18.07.2006 (Вт) 17:06

А задачка как звучит: если с первого раза число не угадал, программа себе подсказывает что число больше или меньше?
Если так, то рэндом можно начинать/заканчивать с текущего числа.
например:
Код: Выделить всё
if a>b then
b=cint(rnd*(999-a))+a
else
b=cint(rnd*999)-a
end if


да и oxygen прав(а):
ты можешь создать массив на 999 эл-в, поставить туда например "1", а после попадания в это число ставить "0"
Последний раз редактировалось XPAHuTEJIb 18.07.2006 (Вт) 17:08, всего редактировалось 1 раз.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Сообщение Debugger » 18.07.2006 (Вт) 17:08

Кодовый замок не получился... Но вот с картами повезло - выкладываю.
Вложения
Kolodec.rar
Игра "Колодец". Сначало запускайте "Card.exe", потом игру...
(69.04 Кб) Скачиваний: 17

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Сообщение Debugger » 18.07.2006 (Вт) 17:09

XPAHuTEJIb писал(а):А задачка как звучит: если с первого раза число не угадал, программа себе подсказывает что число больше или меньше?

Нельзя, бесхитросная машина должна осталваться бесхитростной машиной.

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 18.07.2006 (Вт) 17:15

Debugger писал(а):
1. ...(а вдруг пользователь загадал 999?)...

2. Такой же глюк, когда делает колоду карт. Все карты рандомные. Вроде, все 54 карты идут бодро, но ведь их ещё надо и перетасовать!!!


1. По порядку все равно будет быстрее. Как я понимаю, ты еще и массив динамический зделал? Зачем? Если уж так хочется, то сделай массив numbers(1 to 999) as boolean.
2. Какая разница, перетасованы карты или нет?


Мой чисто дилетантский вариант с картами:

Код: Выделить всё
Private Sub Form_Load()
Dim Cards(1 To 52) As Integer
Const suffle As Integer = 100  ' от этого числа зависит "качество" размешивания.
Dim temp1 As Integer, temp2 As Integer, swap As Integer
Dim i As Integer
Dim human As Integer


   For i = 1 To 52: Cards(i) = i: Next i
   
   Randomize
   For i = 1 To suffle
      temp1 = ((51 * Rnd) \ 1) + 1
      temp2 = ((51 * Rnd) \ 1) + 1
     
     
      swap = Cards(temp2)                    '
      Cards(temp2) = Cards(temp1)            '
      Cards(temp1) = swap                    '
      'Можно еще так
'      Cards(temp1) = Cards(temp2) + Cards(temp1)
'      Cards(temp2) = Cards(temp1) - Cards(temp2)
'      Cards(temp1) = Cards(temp1) - Cards(temp2)
     
   Next i
   
   human = (51 * Rnd \ 1) + 1
   
   For i = 1 To 52
      If Cards(i) = human Then
            MsgBox "Загаданная карта - " & CStr(Cards(i)) & vbNewLine & "Позиция в колоде - " & CStr(i)
            Exit For
      End If
   Next i
   
   Unload Me
   
End Sub
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 18.07.2006 (Вт) 17:15

=) пока писал стока ответов накапало =) извините, если повторился


З.Ы. Интересная игра =) Тыкал все подряд и в конце вылезла табличка "Вы выиграли всю игру" =)
Последний раз редактировалось IIIypuk 18.07.2006 (Вт) 17:19, всего редактировалось 1 раз.
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 18.07.2006 (Вт) 17:16

Играл в такую игру....к чему эти файлы?
не тормозит...всё ок (вроде)

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Сообщение Debugger » 18.07.2006 (Вт) 17:18

Мя, всё здорово катит. Только почему-то когда я запустил программу, я не обнаружил нескольких файлов.

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 18.07.2006 (Вт) 17:19

Не запускается. Ей какой-то компоент нужет. Ты бы лучше код дал... С exe сложно будет сказать. А лучше тот фрагмент, на котором виснет.

2XPAHuTEJIb А по званию не видно?
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 18.07.2006 (Вт) 17:20

Oxygen, посмотри на диске C:\ =) после запуска Card.exe
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 18.07.2006 (Вт) 17:24

' Cards(temp1) = Cards(temp2) + Cards(temp1)
' Cards(temp2) = Cards(temp1) - Cards(temp2)
' Cards(temp1) = Cards(temp1) - Cards(temp2)

Была такая задачка, в ГАНГе ещё учился :)
Ну так суть в том, что идёт перебор и сравнение с картой хумана.
Можно это ускорить, разбив на несколько частей, и искать сразу в каждой части либо поочереди(1-200;201-400;....801-999)

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Сообщение Debugger » 18.07.2006 (Вт) 17:26

Не понял, что это даёт. И посему... 1мс к скорости?

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 18.07.2006 (Вт) 17:29

Искать с середины, начала или выборочно через рандом - это всё равно. Быстрее не будет. Всё будет зависеть от халявы - попадешь или не попадешь. Потому, на мой взгляд, надо выбирать наиболее простое и быстровыполняемое решение - то есть перебор подряд с конца или с начала списка.


XPAHuTEJIb писал(а):ты можешь создать массив на 999 эл-в, поставить туда например "1", а после попадания в это число ставить "0"


Повторюсь. В таком случае легче взять массив Boolean. По дефу False, при попадании ставишь True.



' Cards(temp1) = Cards(temp2) + Cards(temp1)
' Cards(temp2) = Cards(temp1) - Cards(temp2)
' Cards(temp1) = Cards(temp1) - Cards(temp2)

Была такая задачка, в ГАНГе ещё учился Smile
Ну так суть в том, что идёт перебор и сравнение с картой хумана.
Можно это ускорить, разбив на несколько частей, и искать сразу в каждой части либо поочереди(1-200;201-400;....801-999)


При чем здесь Хуман? Эти три строчки - банальный обмен дву переменных значениями без введения третьей.
Последний раз редактировалось IIIypuk 18.07.2006 (Вт) 17:33, всего редактировалось 1 раз.
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 18.07.2006 (Вт) 17:31

Шурик
Ну это если 999 элементов, а если число 10^6?
так 1=тру, 0= фалс

Oxygen
извини, внимания не обратил...
Oxygen вобще унисексный ник

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 18.07.2006 (Вт) 17:33

Что-то я вообще ничего не понимаю. Программа с картами не тормозит совершенно. А по второму вопросу, что там сложного и не понятного. Что-то посты либо один повторяект другой, либо не содержит никакой информативности. Я так и не поняла, что автору вообще нужно на сей данный момент?
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

MeMBus
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 450
Зарегистрирован: 23.02.2005 (Ср) 7:03
Откуда: Из леса...

Сообщение MeMBus » 19.07.2006 (Ср) 3:28

Oxygen писал(а):Я так и не поняла, что автору вообще нужно на сей данный момент?

Чтоб прога не тормозила ;)
А вообще гадать, что там у автора тормозит – трудно. Да и поиск 1 из 999 вариантов при нормальном алгоритме тормозить не будет вообще.
Бороться и искать, найти и перепрятать!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 75

    TopList