Форум: "Основная";
Текущий архив: 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.073 c