Как я заставляю TLinkLabel работать в Delphi?

Событие производительности dTLB-loads-misses:u может использоваться для определения, сбрасывает ли clflush запись TLB, которая отображает указанную строку кэша. Это событие происходит, когда загрузка пропускает все уровни TLB и вызывает просмотр страницы. Это также более широко поддерживается по сравнению с dTLB-stores-misses:u. В частности, dTLB-loads-misses:u поддерживается на Intel P4 и более поздних версиях (кроме Goldmont) и на AMD K7 и более поздних версиях.

Код можно найти по адресу https://godbolt.org/z/97XkkF . Он принимает два параметра:

  • argv[1], который указывает, должны ли быть сброшены все строки указанной страницы 4 КБ или только одна строка кэша.
  • argv[2], который определяет, использовать ли clflush или clflushopt.

Тест прост. Он выделяет одну страницу размером 4 КБ и обращается к одному и тому же местоположению большое количество раз, используя инструкцию загрузки. Однако перед каждым доступом выполняется операция очистки кэша, как указано в argv[1] и argv[2]. Если очистка вызвала удаление записи TLB, то произойдет событие dTLB-loads-misses:u. Если количество событий где-то близко к количеству нагрузок, то мы можем заподозрить, что очистка оказала влияние на TLB.

Используйте следующие команды для компиляции и запуска кода:

gcc -mclflushopt -O3 main.c
perf stat -e dTLB-loads-misses:u ./a.out wholePage opt

где wholePage и opt могут быть 0 или 1. Таким образом, есть 4 случая для проверки.

Я провел тест на SNB, IVB, HSW, BDW и CFL. На всех процессорах и во всех случаях количество событий очень незначительно. Вы можете запустить тест на других процессорах.


Мне также удалось запустить тест для WBINVD, вызвав ioctl в цикле модуля ядра для выполнения инструкции в режиме ядра. Я измерил dTLB-loads-misses:u, iTLB-loads-misses:u и icache_64b.iftag_miss:u. Все они очень незначительны (менее 0,004% от 1 миллиона инструкций по загрузке). Это означает, что WBINVD не очищает DTLB, ITLB или кэш команд. Он только сбрасывает кеши данных.

11
задан Mason Wheeler 12 February 2009 в 21:07
поделиться

3 ответа

Можно назвать ShellExecute. Я записал этот метод для универсальных вызовов, и если работы в Вашем случае.

procedure ShellOpen(const Url: string; const Params: string = '');
begin
  ShellAPI.ShellExecute(0, 'Open', PChar(Url), PChar(Params), nil, SW_SHOWNORMAL);
end;

В Вашем коде необходимо назвать это

procedure TForm1.LinkLabelClick(Sender: TObject);
begin
  ShellOpen(LinkLabel.Caption);
end;
19
ответ дан 3 December 2019 в 02:30
поделиться

TLinkLabel обеспечивает маркировку, которая похожа на ссылку. Это - Ваше задание как программист, чтобы заставить его действовать как ссылка, потому что только можно знать то, как что ссылки, как предполагается, действуют в программе. Вы хотели, чтобы маркировка автоматически открыла веб-браузер пользователя по умолчанию с помощью URL в маркировке, но это не единственная вещь, которую делают ссылки. Например:

  • Internet Explorer не является моим браузером по умолчанию, но когда я нажму на ссылку в Internet Explorer, я не ожидаю, что связанная страница откроется в Firefox.
  • Когда я нажму на ссылку в программе предоставления справочной информации, я ожидаю, что связанная тема появится в программе предоставления справочной информации, не в любом веб-браузере вообще.
  • Предпочтительные страницы в Eclipse очень сложны. Настройки на одной странице иногда связываются с настройками на другой странице. Существуют ссылки на тех страницах, которые берут пользователя непосредственно к связанной странице. Нет никакого URL и никакого HTML, включенного в этом случае, и все же они - все еще маркировки с подчеркнутым текстом.

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

Я предполагаю, что Вы обращаетесь к a TLinkLabel управление, которое идет с Delphi. (Мои версии не имеют такого компонента.) Я предполагаю, что управление Delphi предназначено для имитации того в библиотеке классов .NET. Это может содержать несколько ссылок, и каждая ссылка может сделать что-то другое.

Если Вы хотите управление, которое всегда делает действие оболочки по умолчанию для URL, то рассмотрите использование другого TLinkLabel; тот Alexander Bach делает точно, что Вы ожидали. Это от Delphi 3, но это должно работать неизмененное во всех более поздних версиях также, включая Delphi 2009. При рассмотрении кода Вы будете видеть, как он работает. Это просто звонит ShellExecute, поскольку ответ Cesar демонстрирует.

6
ответ дан 3 December 2019 в 02:30
поделиться

I возникают всевозможные проблемы с TLinkLabel, который поставляется с delphi 2010. a) Элемент управления отображается не как гиперссылка, а как простой текст метки в форме. b) курсор не меняется, чтобы указать, что это ссылка, даже если я установил свойство Cursor. c) событие OnLinkClick вообще не запускается. Я работаю над Windows 7.

Итак, насколько мне известно, TLinkLabel ничего не делает так, как должен, и бесполезен. ShellExecute - единственное решение, которое необходимо поместить в событие OnClick.

4
ответ дан 3 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: