Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Вниз

Какой функцией "подождать" пока отработает код?   Найти похожие ветки 

 
Верный вопрос   (2004-11-21 19:48) [0]

Какой функцией "подождать" пока отработает код перед тем как начнет выполняться следующий код?


 
DrPass ©   (2004-11-21 19:50) [1]

Если речь идет об многопоточном приложении - то обычно WaitForSingleObject. Если об обычном, то в орешник


 
Frozzen   (2004-11-21 19:51) [2]

Такая ситуация может возникнуть при многопоточном приложении
можно использовать критические секции, семофоры или мьютексы


 
Piter ©   (2004-11-21 20:05) [3]

без примера не обойтись...


 
GuAV ©   (2004-11-21 20:11) [4]

Верный вопрос   (21.11.04 19:48)
Какой функцией "подождать" пока отработает код

Код чего ?

потока, процесса ? - WaitForSingleObject.

Чего то ещё ? - в орешник !


 
Верный вопрос   (2004-11-21 20:15) [5]

У меня в TStringList загружается большое кол-во строк. А в ListBox загружается список навигации пл списку в TStringListе.
При кликании по элементу в ListBoxе в TStringListе происходит поиск нужной строки и переписывание данных из "сектора" (строки в TStringListе разделены на "сектора" разделителями Сектора бывают по 3-5 тыс строк) в Memo.
Так вот, если кликать по элементам ListBoxа, то все происходит прекрастно, а вот если пользователь использует для навигации кнопки Up Down то все начинает тормозить, а потом появляется сообщение - стек переполнен.
Предупреждая ответ типа : "Запретить реакцию на кнопки Up и Down" хочу сказать вот что. ListBox очень-очень долго грузит все элементы навигации потому что их слишком много, поэтому приходится держато его в другом TStringListе. А для того чтобы он не тормозил я придумал такую фишку - при загрузке я помещаю в него только 50 прервых элементов списка. Ну, короче вот :

//BaseItems - стринглист содержащий список навигации
//Label2.caption - номер элемента стоящего первым в листбоксе
//Label3.caption - номер элемента стоящего последним в листбоксе

i := strtoint(Label3.caption);

if i < 50 then exit;

if key = vk_down then
  begin
   if not (Label3.caption = inttostr(BaseItems.Count-1)) then
     begin
       ListBox1.Items.Delete(0);
       ListBox1.Items.Insert(50,BaseItems.Strings[strtoint(Label3.caption)+1]);
       Label3.caption := inttostr(strtoint(Label3.caption)+1);
       Label2.caption := inttostr(strtoint(Label2.caption)+1);
     end;
  end;

if key = vk_up then
  begin
   if not (Label2.caption = "0") then
     begin
       ListBox1.Items.Delete(ListBox1.Items.Count-1);
          ListBox1.Items.insert(0,BaseItems.Strings[strtoint(Label2.caption)-1]);
       Label3.caption := inttostr(strtoint(Label3.caption)-1);
       Label2.caption := inttostr(strtoint(Label2.caption)-1);
     end else exit;
  end;
end;


Надеюсь теперь стало хоть чуть яснее.


 
Верный вопрос   (2004-11-21 20:26) [6]

Короче я пишу для одного сайта программу содержащую солюшены (прохождения) к играм. Игр дофига, прохождения бывают более чем на 200 страниц. Все это дело храню в одном файле таким образом :

============================
список игр
---------------
---название игры---
прохождение к ней
--=-=-=-=-=-=-=-=-=--
---название игры---
прохождение к ней
--=-=-=-=-=-=-=-=-=--
---название игры---
прохождение к ней
--=-=-=-=-=-=-=-=-=--
============================

Если быстро проходится по списку навигации, то стек переполняется.


 
DesWind ©   (2004-11-21 20:27) [7]

Здесь должна хорошо подойти критическая секция модуль SyncObj если не ошибаюсь


 
Piter ©   (2004-11-21 21:42) [8]

Верный вопрос   (21.11.04 20:15) [5]

у меня только один вопрос. Нафига использовать TStringList? Почему бы не хранить информацию в TListBox?

Хотя еще интересно что за секции... чего то ты намудрил


 
DrPass ©   (2004-11-21 22:11) [9]


> ListBox очень-очень долго грузит все элементы навигации
> потому что их слишком много, поэтому приходится держато
> его в другом TStringListе

Перед тем, как грузить, вызови ListBox.Lines.BeginUpdate, после завершения - ListBox1.Lines.EndUpdate, будет намного быстрее
Что касается твоего вопроса - в однопоточном приложении не бывает ситуации, когда один код выполняется до того, как закончилась предыдущая команда. У тебя ошибка где-то в логике приложения.


 
KilkennyCat ©   (2004-11-21 22:16) [10]

так как есть

> ListBox1.Items.Count


спользование подобного:

> Label3.caption := inttostr(strtoint(Label3.caption)+1);
> Label2.caption := inttostr(strtoint(Label2.caption)+1);

некрасиво.


 
Верный вопрос   (2004-11-22 00:19) [11]

>Piter ©   (21.11.04 21:42) [8]
>у меня только один вопрос. Нафига использовать TStringList? Почему >бы не хранить информацию в TListBox?

1). Загрузи в TListBox ок. 90.000 строк.
2). Попытайся быстро по ним перемещаться, искать отсеивать и т.д.
3). Перегружай и обновляй элементы листбокса каждый раз, когда  
   происходит загрузка нового списка.

Сколько времени потребуется? Даже 1) не выполнишь. Вот для этого и СтрингЛист.

>Хотя еще интересно что за секции... чего то ты намудрил

Как ты можешь посоветовать мне хранить ок 90.000 описаний, прохождений и кодов от игр не разделяя их друг от друга в одном файле? Плюс к этому обеспечить быстрый доступ к любому из них в случае чтения, записи или перезаписи?
Поэтому приходится разделять их друг от друга метками, части между двумя метками я назвал "секциями" потому что не смог придумать название более популярно описывающее эти блоки информации.

Жду ответа.


 
Eugene1501   (2004-11-22 00:40) [12]

Мне кажется для таких задач лучше использовать базы данных.

Кроме того DrPass уже говорил:
>Что касается твоего вопроса - в однопоточном приложении не >бывает ситуации, когда один код выполняется до того, как >закончилась предыдущая команда. У тебя ошибка где-то в логике >приложения.


 
Palladin ©   (2004-11-22 00:50) [13]


> [11] Верный вопрос   (22.11.04 00:19)

Твои способности не стоят показываемой амбиции.


 
Верный вопрос   (2004-11-22 01:20) [14]

>Palladin ©   (22.11.04 00:50) [13]
>Твои способности не стоят показываемой амбиции.

О моих способностях вы ничего не знаете, а соответственно и судить не можете. Амбиции я никакой не показывал в отличии от ответов некого Piter ©. Я на вашем сайте нвсего около года, но Piter мне запомнился тем что он постоянно отвечает подобным образом - высокомерно и неуважительно. Заметьте : пост [5] объясняет что такое это "секции" а пост [6] их еще и схематически показывает. И почему использовать Листбокс не удобно там тоже объяснено.

Piter ©   (21.11.04 21:42) [8]

Верный вопрос   (21.11.04 20:15) [5]

у меня только один вопрос. Нафига использовать TStringList? Почему бы не хранить информацию в TListBox?

Хотя еще интересно что за секции... чего то ты намудрил


Ну как можно спокойно реагировать на такое?

И вообще я на этом сайте заметил такое не только у Piter а у многих, очень многих тутошных обитателей. Если сказать нечего - лучше вообще ничего не говорить чем говорить не по делу и флудить, нет, начинают угарать над тем что человек в программировании соображает мало и задает на их взгляд тупые вопросы. А сами когда только учились программировать что не разу не задавали вопросы типа "А как скопировать из одного Мемо текст в другой Мемо"

Спасибо за внимание. Досвидания.


 
Piter ©   (2004-11-22 01:38) [15]

Верный вопрос   (22.11.04 0:19) [11]
Загрузи в TListBox ок. 90.000 строк


я что, на идиота похож?

Вопросы не те задаешь. У тебя ЛОГИКА ПРИЛОЖЕНИЯ НЕПРАВИЛЬНАЯ. Это глупо - выводить 90 ТЫСЯЧ строк куда бы то ни было. И не стоит искать компонент, который может с этим справится. Это даже с точки зрения интерфейса не юзабельно. Представляю, если мне предложать выбрать из 90.000 строк нужную мне. Я рехнусь.
Делай поиск, используй что-то типа базы данных.

Как минимум нужно разделить все игры по алфавиту, что уже снизит хотя бы раз в 20 объем информации в каждом разделе. Плюс сделай многостраничное отображение информации, как делают поисковые машины, допустим, не более 100 записей на одной странице. В общем, копать в эту сторону, а не в ту область "как вывести 90.000 строк на экран сразу".


 
Piter ©   (2004-11-22 01:59) [16]

Верный вопрос   (22.11.04 1:20) [14]
Ну как можно спокойно реагировать на такое?


а что такого? Я спросил зачем ты используешь TStringList. А потом еще спросил что за секции.

Данными вопросами я тебя оскорбил? :)
Ты пойми, тут тоже люди не глупые. И если ты объясняешь, а люди не понимают - вполне возможно, что ты коряво объясняешь.

Спасибо за внимание. Досвидания

пока, пока :)
Пойми простую вещь - ответ на вопрос нужен ТЕБЕ. Мне и многим другим параллельно обидешься ты или нет, уйдешь с этого сайта или нет.

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

О моих способностях вы ничего не знаете, а соответственно и судить не можете

тут ты не прав. Ты же привел кусок кода. А по коду вполне даже можно судить об уровне программиста. Не точно, но приблизительно можно...


 
Мирон ©   (2004-11-22 02:16) [17]

Piter ©   (22.11.04 1:38) [15]
В общем, копать в эту сторону, а не в ту область "как вывести 90.000 строк на экран сразу".


Гм... Так автор, вроде, и двигался в этом направлении. Хоть и через ж%@., но все-таки...


 
Германн ©   (2004-11-22 03:01) [18]

2 Верный вопрос   (21.11.04 20:15) [5]
Не вдавался в детали твоего алгоритма. Но возникли сомнения, когда ты сказал, "при загрузке я помещаю в него только 50 прервых элементов списка."
И при этом:
ListBox1.Items.Delete(0);  //Уничтожаем Item 0
ListBox1.Items.Insert(50,BaseItems.Strings[strtointLabel3.caption)+1]); //Добавляем Item 50!...

то бишь - таки сколько строк у тебя 50 или 51?


 
Верный вопрос   (2004-11-22 03:03) [19]

Piter ©   (22.11.04 01:59) [16]

>У тебя ЛОГИКА ПРИЛОЖЕНИЯ НЕПРАВИЛЬНАЯ. Это глупо - выводить 90 >ТЫСЯЧ строк куда бы то ни было.

90.000 строк на экран я не вывожу. Даже намека на это нигде не было. Я сказал что они содержатся в TStringListr а он как известно на экран не лезет.

>Представляю, если мне предложать выбрать из 90.000 строк нужную >мне. Я рехнусь.

Пользователю хотящему найти игру среди этого списка предстоит потрудится и всего навсего ввести хоть малюсенький кусок ее названия, хоть обрывок конца названия в строку поиска и опа, все названия из базы совпавшие с запрашиваемым текстом будут немедленно показаны в Листбоксе. А далее кликай по назвыанию и менее чем за треть секунды в поле "Описание" представленное Ричедитом появится текст относящийся к этой игре.

>Это даже с точки зрения интерфейса не юзабельно.

Интерфейс простой : окно разделено на две части - правую и левую. Левая более узкая чем правая потому что в ней находится листбокс с названиями игр и строка поиска. Правая сторона - ричедит в котором отображается текст по игре. Вот и весь интерфейс.

И вообще все в оффтоп ушло, блин, я кажется понял как объяснить :
Короче листбокс, в нем названия игр кликаю по любому его элементу , текст соответствующий выбраной игре появляется в поле описания.  Жму кнопку Down, фокус переходит на нижестоящий элемент, начинается заполнение текстом поля описания. Поле заполниться еще не успело а фокус в листбоксе перешел уже на следующий элемент и
поле начало заполняться снова. После 20-30 таких переходов все виснет и появляется таблчка типа Стек переполнен. Как этого избежать? Вот.


 
Верный вопрос   (2004-11-22 03:07) [20]

>Германн ©   (22.11.04 03:01) [18]

ListBox1.Items.Insert(50,BaseItems.Strings[strtointLabel3.caption)
+1]); //Добавляем Item не 50 а 51


 
Германн ©   (2004-11-22 03:17) [21]

2 Верный вопрос   (22.11.04 03:07) [20]
То бишь сначала последняя строка списка имела индекс 49. Затем удалили нулевую строку и последняя строка заимела индекс 48. И после всего этого ты вставляешь строку с индексом не 50 а 51! :(((


 
GuAV ©   (2004-11-22 03:19) [22]

Верный вопрос   (21.11.04 20:15) [5]
ListBox очень-очень долго грузит все элементы навигации потому что их слишком много, поэтому приходится держато его в другом TStringListе. А для того чтобы он не тормозил я придумал такую фишку - при загрузке я помещаю в него только 50 прервых элементов списка.


Всё это неправильно !
Надо Style := lbVirtual и обрабатывать OnData
Посмотри в демках Virtual ListView.


 
Юрий Зотов ©   (2004-11-22 03:23) [23]

> Верный вопрос   (22.11.04 03:03) [19]

Задизаблите кнопку Down на время заполнения ричэдита, вот и все проблемы. Или, если это невозможно, то флажок введите.

Метод_заполнения_ричэдита (вариант 1).
begin
 DownButton.Enabled := False;
 try
   ... // Заполняем ричэдит
 finally
   DownButton.Enabled := True
 end
end;

Метод_заполнения_ричэдита (вариант 2). // Flag - глоб. пер-ная.
begin
 if not Flag then
 begin
   Flag := True;
   try
     ... // Заполняем ричэдит
   finally
     Flag := False
   end
 end
end;


 
GuAV ©   (2004-11-22 03:33) [24]

procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer;
 var Data: String);
begin
  Data := Format("Элемент № %d", [Index]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ListBox1.Style := lbVirtual;
 ListBox1.Count := 10000;
end;

Этот список лёгко обрабатывает 10000 элементов. А Virtual Listview и миллион строк потянет (через ownerdata и OnData).


 
Верный вопрос   (2004-11-22 03:53) [25]

Спасибо Всем! Похоже получается!

>Германн ©   (22.11.04 03:17) [21]
...
Вот примерный кусок кода. может что не верно, писал тут по памяти в 05:52 по нашему.


if BaseItems.count-1 < 50 then
u := BaseItems.count-1 else
u := 0;
for i := u to 50 do
 begin
  ListBox1.Items.add(BaseItems.Strings[i]);
 end;
        Label2.Caption := inttostr(0);
        Label3.Caption := inttostr(50);

......

if key = vk_down then
 begin
  if not (Label3.caption = inttostr(BaseItems.Count-1)) then
    begin
      ListBox1.Items.Delete(0); /// удаляем первую      
      ///а так как строк стало 49, то последняя освободилась,  ///значит
ListBox1.Items.Insert(50,BaseItems.Strings[strtoint(Label3.caption)+1]);
///Вставляем в пустую 50 строку элемент под номером
///strtoint(Label3.caption)+1 - что значит 51

      Label3.caption := inttostr(strtoint(Label3.caption)+1);
      Label2.caption := inttostr(strtoint(Label2.caption)+1);

//После этого прибавляем к обоим индексам по 1

    end;
 end;


Все еще непонятно?


 
Германн ©   (2004-11-22 04:40) [26]

2 Верный вопрос   (22.11.04 03:53) [25]
Увы, все еще не понятно. :(

В частности не понятно:

u := 0;
for i := u to 50 do

От i:=0 до i:=50 - 51 итерация. А у тебя есть их?


 
Верный вопрос   (2004-11-22 09:34) [27]

Базара нет, опИсался, говорю же прямо тут писал, стдесб правильно будет так

if BaseItems.count-1 < 50 then
u := BaseItems.count-1 else
u := 0;
for i := 0 to u do
begin
 ListBox1.Items.add(BaseItems.Strings[i]);
end;


 
Skyle ©   (2004-11-22 12:21) [28]

Поле заполниться еще не успело а фокус в листбоксе перешел уже на следующий элемент и
поле начало заполняться снова.


Положить таймер, который перезапускается каждый раз при изменении активного элемента листбокса. А в его обработчике уже сделать отключение таймера и показ текста в RichEdit. Интервал таймера - по желанию.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.058 c
14-1100677558
by
2004-11-17 10:45
2004.12.05
Я бы в архитекторы/проектировщики ПО пошел, пусть меня научат.


1-1100685529
Lola
2004-11-17 12:58
2004.12.05
Вывести список файлов из папки, в имени которой есть побел


3-1099982571
diabolik_krsk
2004-11-09 09:42
2004.12.05
Удаление записей из подчиненной таблицы


1-1100782230
Tomkat
2004-11-18 15:50
2004.12.05
Криптография


1-1101198790
Jann
2004-11-23 11:33
2004.12.05
Нужна прога





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский