Вверх ↑
Этот топик читают: Гость
Ответов: 689
Рейтинг: 20
#1: 2006-06-28 16:00:20 ЛС | профиль | цитата
Цель: после нажатия на кнопку отобразить дочернюю форму с имеющейся на ней прогресс баром и показывать пополнение таблицы строк. Для отладки и теста составил вот такое приложеньице:
code_45
В чем проблемы:

  • Работает не так как надо: т.е. бар движется, а таблица при этом не пополняется - Надо что-бы это происходило парралельно.
  • Если на форму (дочернюю) поместить текст или рисунок, то он не будет отображаться - будет отображаться только рамка формы и все.
  • Иногда даже прогресс бар не отображается и я не пойму почему.
  • После закрытия дочерней формы иногда бывает ошибка и тоже не пойму почему.

Помогите разобраться с ошибками и направить на путь истинный
карма: 0

0
файлы: 1code_45.txt [3.3KB] [761]
Администрация
Ответов: 15295
Рейтинг: 1519
#2: 2006-06-28 16:35:44 ЛС | профиль | цитата
Решение 1: использовать потоки.
Решение 2: почитать описание компоненнта !Application!
карма: 27
0
Ответов: 689
Рейтинг: 20
#3: 2006-06-28 16:58:17 ЛС | профиль | цитата
судя по описанию, мне больше подходит компонент Application, а есть ли где нибудь примеры его использования (не параметры передаваемы приложению, а именно отображение дочерней формы)

с потоками почему то не получается... ошибка после закрытия
карма: 0

0
Ответов: 8930
Рейтинг: 823
#4: 2006-06-28 17:00:30 ЛС | профиль | цитата
oldTV, воспользоваться Потоком это так: code_46 Когда работает цикл For он не даёт времени на отрисовку всяких Списков строк и программа работает быстрее (это моё представление о этом цикле), при заполнении 1000 строк вниз визуально отображаются немного первых и смысл отрисовки теряется
(При выставлении схемы для оказания помощи старайтесь не пропускать связи за компонентами и не допускать их (линий связи) совпадения)
карма: 19

0
файлы: 1code_46.txt [3.6KB] [911]
Ответов: 689
Рейтинг: 20
#5: 2006-06-28 17:03:50 ЛС | профиль | цитата
Леонид, счас попробую твой вариант с заменой цикла счетчиком.
карма: 0

0
Ответов: 9906
Рейтинг: 351
#6: 2006-06-28 18:08:42 ЛС | профиль | цитата
Леонид, ты чего фигней занимаешься

НЕ ВИЗУАЛЬНЫЕ действия надо выполнять в параллельном потоке, а остальные ОТРИСОВКИ выполнять по событиям таймера (главный поток).

Причем, чаще, чем 100мс, не очень имеет смысл - на скоростную видеокамеру никто снимать не собирается (а если и соберется, то пусть сначало ось сменит, на такую же, но - реального времени).
И не сильно отрисовка подгрузит - современные компы за 100мс черта отрисовать смогут...

[size=-2]------ Добавлено в 18:08
Да вот еще:
Thread.html писал(а):
  • Не рекомендуется изменять внешний вид интерфейсных элементов из схемы, стоящей после метода doExec. Связано это с тем, что все управление визуальными компонентами происходит с помощью асинхронной посылки всевозможных сообщений элементу. Т.е. шевельнули мы мышкой и Windows уже шлет окну или отдельному элементу сообщение о перемещение мыши с её новыми координатами. Этот механизм иногда нарушается при одновременном манипулирование одним и тем же элементом из основного процесса и из потока. Проявляется это нарушение начиная от неверной прорисовки до аварийного завершения программы.
  • курсив - мой
    карма: 9

    0
    Ответов: 8930
    Рейтинг: 823
    #7: 2006-06-28 18:15:13 ЛС | профиль | цитата
    Galkov, когда не знаешь законов, приходится жить по понятиям Оставим это.
    Нужна консультация: сделал программку для LTP, на моём компьюторе работает, у товарища (у него нет HiAsm) выдаёт сообщение VICX-Error Драйвер не работает !!! Что бы это значило?
    карма: 19

    0
    Ответов: 9906
    Рейтинг: 351
    #8: 2006-06-28 20:00:00 ЛС | профиль | цитата
    Это значит, что NT-винды категорически не дают работать с портами на прямую (слава Биллу ).
    Только при установленном дрвйвере vicx.sys
    В HiAsm это делается нажатием на соответствующую кнопочку.
    Но, теоретически, в дистрибутиве (папка Plug) существует утилитка install_vicx.exe, которая должна делать то же самое.
    Исходников на нее я не видел, и чего такое драйвер - не очень знаю.
    Так же не знаю, оскорбится ли она на отсутствие vicx.dll, но LPT и PortIO элементам dll-ки не нужны - это точно.

    [size=-2]------ Добавлено в 19:51
    Леонид писал(а):
    Оставим это

    Не фига себе - оставим....
    Совершенно типовая задача, ведь

    Вот скажем у меня есть программатор: перегоняет, грубо говоря, по-байтно файл на, мной же сделанный, девайс (а тот уже и занимается "шевелением" линий, необходимых для программирования других девайсов)

    Ну вот, цикл по Stream-у а делаю в потоке, а ProgressBar отрисовывается по таймеру - в основном потоке. Типа, по науке все....
    И получается, что у меня проще - фоновые события не трогают визуальных контроллов.
    А в вышеобсуждаемом случае получается, что фоновые события - заполнение StringTable

    Вот так-то и нельзя.

    Думать надо. Наверное, логика должна быть другой: заполнять в фоне StrList, скажем, а по событиям таймера останавливать поток (причем в нужном месте - возможны конфликты данных при параллельной работе), отрисовывать все чего надо: ProgressBar, перекачать StrList в StringTable, очистить StrList
    карма: 9

    0
    Ответов: 8930
    Рейтинг: 823
    #9: 2006-06-28 20:32:29 ЛС | профиль | цитата
    Galkov, поток можно приостановить, а цикл? чтобы отрисовать положение по этому циклу, кстати к недавнему разговору о цикле For - не помешала бы эта функция Приостановка и Пуск после неё?
    карма: 19

    0
    Ответов: 689
    Рейтинг: 20
    #10: 2006-06-28 22:06:56 ЛС | профиль | цитата
    Ребят, Вы меня конечно простите, но Ваши посты ввели меня в заблуждение. Я так понял Леонид предложил метод, а Galkov с ним не согласен? Так?

    Затем Вы почему то переключились на другую тему, нужную Леониду... Спасибо Galkov потом перевел в нужное русло.

    Далее, просматривая код, я обнаружил, что (code 47), у меня не работает и то что вероятно имел Galkov, я не увидел.

    Из всего вышеописанного могу ли я сделать такие выводы:

    • все расчеты, математические действия, операции с вычислениями, т.е. все действия каким либо образом не связанные с отрисовкой формы необходиом выполнять в отдельном потоке, если они занимают много времени. Более 100 мс.
    • все отрисовки форм выполнять по событию таймера.

    Отсюда непонятности. Как? Пример не очень нагляден, уж простите, Galkov...

    Логика моей программы такова:
    узер жмет кнопку и начинается опрос компьютеров. Известен список компьютеров = n. Хотя извините, n мало, пусть будет k. Так вот. Уже известно макс прогресс бара = k. Рисуется форма - где есть прогресс бар с максом. Далее начинается цикл - от 1 до k и начинает бросать в таблицу на первой форме значения (в моем примере число) и вторым действием в хабе бросать на прогресс текущую позицию. Когда текущая позиция равна макс прогресс бара - форма (дочерняя) закрывается.
    Леонид предложил использовать вместо цикла счетчик. Это идея, но я пока не пробовал. Galkov засомневался и я с ним тоже.

    Как правильно сделать?
    карма: 0

    0
    Ответов: 9906
    Рейтинг: 351
    #11: 2006-06-28 22:23:09 ЛС | профиль | цитата
    oldTV, код дается чтобы в нем разбираться, а не нажимать кнопочку <Compile>

    Как он мог работать, блин....
    Если там мультик ПУСТОЙ

    Вообще-то класс: то, что мультик пустой, и какой комент на нем - не видел, но - НЕПОНЯТНО
    карма: 9

    0
    Ответов: 689
    Рейтинг: 20
    #12: 2006-06-28 22:28:52 ЛС | профиль | цитата
    - сча увидел , понятно... будем думать в этом направлении
    Ответь на вопросы, если не сложно. Это многое прояснит, для меня прояснит...

    P.S. И еще... (кстати давным давно надо переименовать P.S. в И.Е.=И еще...) пргресс бар в дочерней форме. Если сделать в той же форме - не вопрос, работает. В дочерней - вот такая заморочка. В примере - та же.
    карма: 0

    0
    Ответов: 9906
    Рейтинг: 351
    #13: 2006-06-28 23:03:19 ЛС | профиль | цитата
    oldTV, какие вопросы
  • искать твои компы со своего - и не подумаю.
  • у меня ProgressBar работает из любого места, хоть на другой комп переноси.
    Леонид, по теории, Приостановка делается так: code_48 Но от этого мало толку, поскольку, после подачи сигнала WAIT надо еще дождаться, пока этот WAIT начнется....
    Заморочка на заморочке....
    Мне кажется, что проще и надежнее делать как раньше, но с маленькой доработкой:
    Add(Timer,9036834,203,49)
    {
    Interval=100
    Enable=1
    link(onTimer,16580948:doStop,[(262,55)(262,55)])
    }
    Add(Thread,16331575,203,133)
    {
    Delay=0
    link(onExec,16580948:doRepeat,[(250,139)(250,48)])
    link(onSyncExec,2584730:doEvent1,[])
    }
    Add(Repeat,16580948,266,42)
    {
    Type=4
    Op2=Integer(10000)
    Check=1
    link(onRepeat,7626550:doNext,[])
    link(Op1,16603336:Var1,[(272,32)(313,32)(313,86)])
    }
    Add(MultiElementEx,3898734,385,42)
    {
    @Hint=#55:Тут очень сложный НЕ ВИЗУАЛЬНЫЙ вычислительный алгоритм|
    link(onAdd,3913570:doAdd,[])
    }
    BEGIN_SDK
    Add(EditMultiEx,4793706,3,3)
    {
    WorkCount=#9:doProcess|
    EventCount=#5:onAdd|
    VarCount=#5:Index|
    }
    END_SDK
    Add(StrList,3913570,462,42)
    {
    }
    Add(Button,13855245,84,119)
    {
    Left=10
    Top=5
    Width=40
    Height=40
    Caption="Пуск"
    link(onClick,4479881:doEvent1,[])
    }
    Add(Hub,4479881,140,119)
    {
    OutCount=3
    link(onEvent1,9036834:doTimer,[(190,125)(190,55)])
    link(onEvent2,7626550:doReset,[(306,132)(306,62)])
    link(onEvent3,16331575:doStart,[])
    }
    Add(Hub,2584730,266,140)
    {
    OutCount=4
    link(onEvent1,6766117:doEnum,[(444,146)(437,146)])
    link(onEvent2,3913570:doClear,[(372,153)(372,55)])
    link(onEvent3,9690015:doData,[(310,160)(310,160)])
    link(onEvent4,3078378:doCompare,[])
    }
    Add(ArrayEnum,6766117,476,140)
    {
    link(onItem,198369:doAdd,[])
    link(Array,3913570:Array,[])
    }
    Add(StringTable,198369,525,140)
    {
    Left=60
    Top=5
    Width=325
    Height=240
    Columns=#5:Число|17:Ерунда всякая=200|
    }
    Add(DoData,9690015,378,154)
    {
    link(onEventData,11334302:doPosition,[])
    link(Data,16603336:Var3,[(384,86)])
    }
    Add(Button,3803748,84,56)
    {
    Left=10
    Top=50
    Width=40
    Height=40
    Caption="Стоп"
    link(onClick,3331107:doWork2,[])
    }
    Add(Hub,7091741,140,56)
    {
    link(onEvent1,9036834:doStop,[])
    link(onEvent2,16331575:doStop,[(182,69)(182,146)])
    }
    Add(ProgressBar,11334302,427,154)
    {
    Left=5
    Top=245
    Width=380
    Max=10000
    Smooth=1
    ProgressColor=16711680
    }
    Add(Counter,7626550,322,42)
    {
    Max=10000
    link(onNext,3898734:doProcess,[])
    }
    Add(GetDataEx,16603336,315,77)
    {
    link(Data,7626550:Count,[])
    }
    Add(If_else,3078378,322,161)
    {
    Type=4
    Op2=Integer(10000)
    link(onTrue,3331107:doWork3,[(364,167)(364,114)(130,114)])
    link(Op1,16603336:Var2,[])
    }
    Add(HubEx,3331107,126,49)
    {
    link(onEvent,7091741:doEvent1,[])
    }
    btw: в своем первом примере "вечный" цикл я сделал неправильно (типа поспешил): там надо Repeat.Check=After
  • карма: 9

    0
    файлы: 1code_48.txt [967B] [776]
    Ответов: 3655
    Рейтинг: 69
    #14: 2006-06-28 23:24:59 ЛС | профиль | цитата
    oldTV, Вот тебе рабочий пример code_49
    карма: 0

    0
    файлы: 1code_49.txt [1.4KB] [807]
    Ответов: 16884
    Рейтинг: 1239
    #15: 2006-06-29 08:25:38 ЛС | профиль | цитата
    oldTV, Вот то о чем говорил тебе Dilma (схема твоя)
    Add(MainForm,2037592,32,148)
    {
    Left=20
    Top=105
    Point(Left)
    Point(Top)
    }
    Add(ChildForm,11094603,501,183)
    {
    }
    BEGIN_SDK
    Add(EditMulti,1353078,3,3)
    {
    WorkCount=5
    VarCount=1
    link(doWork1,9518471:doPosition,[(40,9)(40,104)])
    link(doWork2,9518471:doMax,[(40,16)(40,111)])
    link(Var1,5888265:Handle,[(9,138)(83,138)])
    }
    Add(MainForm,5888265,77,28)
    {
    Left=35
    Top=105
    Height=46
    Color=-16777212
    Font=[Tahoma,8,0,0,204]
    Caption="???????? ! ???? ???????? ?????? ???????????. ?????????..."
    BorderStyle=4
    ShowType=1
    TaskBar=1
    Visible=1
    Cursor=5
    MouseCapture=0
    Position=1
    Point(doVisible)
    }
    Add(ProgressBar,9518471,77,98)
    {
    Left=5
    Top=5
    Width=385
    Height=10
    Smooth=1
    ProgressColor=8388608
    Point(doMax)
    }
    END_SDK
    Add(Button,15498871,137,309)
    {
    Left=10
    Top=10
    Width=80
    Height=25
    link(onClick,16218418:doEvent1,[])
    }
    Add(Hub,2708631,403,309)
    {
    OutCount=8
    link(onEvent1,471199:doHideCloseButton,[])
    link(onEvent2,471199:doHideMinimizeButton,[(468,322)(468,322)])
    link(onEvent3,471199:doHideMaximizeButton,[(468,329)(468,329)])
    link(onEvent4,471199:doHideSYSMENU,[(468,336)(468,336)])
    link(onEvent5,13674102:doOperation,[(531,343)(531,315)])
    link(onEvent6,3209915:doLeft,[(503,350)(503,315)])
    link(onEvent7,3209915:doTop,[(503,357)(503,322)])
    }
    Add(Hub,16218418,221,309)
    {
    OutCount=6
    link(onEvent1,15623828:doClear,[(262,315)(262,476)])
    link(onEvent2,3986514:doData,[(310,322)(310,189)])
    link(onEvent3,2708631:doEvent1,[(310,329)(310,315)])
    link(onEvent4,12843319:doEvent1,[(274,336)(274,392)])
    link(onEvent5,11478214:doActive,[])
    link(onEvent6,5309761:doFor,[(311,350)(311,392)])
    }
    Add(GetData,5236718,501,239)
    {
    Count=3
    link(Data,11094603:Var1,[])
    }
    Add(For,5309761,361,386)
    {
    Start=1
    link(onEvent,3859791:doEvent1,[])
    link(onStop,9819621:doData,[(403,399)(403,423)(274,423)(274,434)])
    link(End,1774201:Data1,[(374,262)(367,262)])
    }
    Add(GlobalVar,11852600,361,71)
    {
    Name="100"
    Data=Integer(10000)
    }
    Add(Hub,3859791,403,386)
    {
    OutCount=3
    link(onEvent1,8763891:doProcessMessages,[])
    link(onEvent2,15623828:doAdd,[(485,399)(485,469)])
    link(onEvent3,6976788:doData,[(445,406)(445,423)(351,423)(351,434)])
    }
    Add(DoData,6976788,361,428)
    {
    link(onEventData,11094603:doWork1,[(447,434)(447,189)])
    link(Data,5309761:Position,[])
    }
    Add(StringTable,15623828,536,463)
    {
    Left=110
    Top=10
    Width=265
    Height=250
    Columns=#5:Число|
    Grid=0
    Redaction=1
    Point(doEnsureVisible)
    Point(onAdd)
    link(onAdd,15623828:doEnsureVisible,[(579,476)(579,520)(526,520)(526,504)])
    }
    Add(WinTools,11478214,361,309)
    {
    link(Handle,5236718:Data1,[(367,290)(507,290)])
    }
    Add(SysMenu,471199,501,309)
    {
    link(Handle,5236718:Data2,[(507,290)(514,290)])
    }
    Add(PosWindow,3209915,571,309)
    {
    link(Handle,5236718:Data3,[(577,290)(521,290)])
    link(Left,2037592:Left,[(584,255)(45,255)])
    link(Top,13674102:Result,[(591,291)(615,291)(615,351)(633,351)])
    }
    Add(DoData,3986514,361,183)
    {
    link(onEventData,11094603:doWork2,[(447,189)(447,196)])
    link(Data,1774201:Data2,[(367,161)(374,161)])
    }
    Add(Math,13674102,627,309)
    {
    Op2=150
    link(Op1,2037592:Top,[(633,255)(52,255)])
    }
    Add(GetData,1774201,361,106)
    {
    link(Data,11852600:Var,[])
    }
    Add(Hub,12843319,284,386)
    {
    InCount=2
    OutCount=1
    link(onEvent1,11478214:doVisible,[(338,392)(338,315)])
    }
    Add(DoData,9819621,284,428)
    {
    Data=Integer(0)
    link(onEventData,12843319:doEvent2,[(326,434)(326,423)(274,423)(274,399)])
    }
    Add(Application,8763891,522,386)
    {
    }

    [size=-2]------ Добавлено в 08:25
    Знаки "??????????????" - это издержки моего иврита
    Если примениш модернизированый Galkov - ым StringTable, то одновременно с ProgressBar будут бежать строки в StringTable
    карма: 25
    Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
    0
    Сообщение
    ...
    Прикрепленные файлы
    (файлы не залиты)