|
|
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyAleksandr SharahovТолько достает обходить. Это и есть реальная проблема? Реальная проблема - скорость в многопоточных приложениях, в пользовательском интерфейсе или в неумелых руках. И примеров тому море. Вот из недавнего прошлого. Есть процедура, которая вызывается из UI. Интенсивно использует строки, варианты и прочее колдунство. Работает ~11 сек, что естественно нервирует пользователя. Ценой различных извращений время удалось снизить до 3 сек. Уверен, если бы у разработчиков не было под рукой всего этого супер-арсенала, время работы процедуры было бы в районе 0.3-0.5 сек. Вот из очень далекого. Программист, который в жизни своей написал всего-то две-три прожки длиной больше 500 строк, ни с того ни с сего принялся писать довольно эффективные программы, в которых и строк было в достатке, и вычислений. А все потому, что в тогдашнем компиляторе всего этого супер-арсенала не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 19:46 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
TASM.EXE вам в руки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 20:17 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, что, как-то, быстро ты перешёл от COW на управляемые типы вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 21:16 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, ты хочешь поговорить об этом? только теперь не знаю уже, стоит ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2015, 09:03 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyCobalt747Копировать ему в буфер сразу, и пусть с ним делает всё что захочет. Наличие COW, как раз, и позволяет избегать ненужных копирований. BeltarВообще у любого нормального человека при работе с компом вырабатывается правило, прежде чем что-то править, делай копии и сохраняйся, как можно чаще, если не вырабатывается, то таких нельзя к компам на пушечный выстрел подпускать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2015, 09:57 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovтолько теперь не знаю уже, стоит ли. Не держи в себе. Cobalt747BeltarВообще у любого нормального человека при работе с компом вырабатывается правило, прежде чем что-то править, делай копии и сохраняйся, как можно чаще, если не вырабатывается, то таких нельзя к компам на пушечный выстрел подпускать. Ты сейчас о чём, вообще??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2015, 10:15 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Вот и я столкнулся с забавной ситуацией, когда при попытке перенести на Delphi 10.1/10.2 приличный объем кода с VCL (который изначально не предполагалось портировать под другие платформы) на Android радостно все отладил в FM под Виндой, а потом сменил платформу и вылезли грабли отсутствия типа AnsiString для Андроид. В коде много строк в DOS-кодировке (идет работа с различным железом): Код: pascal 1. 2. Было очень удобно совмещать такой тип с юникодом (задал кодировку и можно присваивать юникодную строку даже без явного приведения типа если уверен, что кроме латинских символов и кириллицы ничего нет) и копировать данные Move() в буфер для передачи в железо или обратно. Попробовал хак из первого сообщения темы, только более свежую версию для D10.1 - для Андроида получил ошибку при попытке объявить тип "DosString = type AnsiString(866);" и заметил, что для Андроида при использовании Move начальным элементом анси-строки является нулевой элемент. Еще вместо AnsiString попробовал RAWByteString и SetCodePage (небольшие задержки не критичны). Но тут если сменил кодировку на CP866, то и добавлять нужно тоже в этой же кодировке или сначала формировать все в Win1251 и только перед передачей в железку менять кодировку. Видимо, по этому пути и придется идти, но все это займет прилично времени на модификацию кода и как бы где-то чего-то не забыть. Поэтому на всякий случай хочу спросить, может кто уже нашел более изящное решение для такой задачи и ему будет не жалко поделиться своими мыслями. З.Ы. Попробовал и вот такой "велосипед" , но на 10.1/10.2 он сходу не завелся. Попробовал поправить ошибки насколько я понял смысл действий автора - не сработало даже банальное присваивание значения строке, не говоря уже об автоматической конвертации кодировок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2018, 15:51 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
вот поэтому всегда говорилось - не используйте хаки типа PalychXXможно присваивать юникодную строку даже без явного приведения типа если уверен INDY вообще тотально вместо массива байт строки гоняло ни к чему хорошему это не приводит если есть кодировки, то можно пользоваться TStringStream с явным указанием Encoding там все будет перекодировываться нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2018, 15:55 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
PalychXX, Придётся писать костыли, никуда не денешься ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2018, 21:56 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
krapotkinможно пользоваться TStringStream с явным указанием Encoding Спасибо, но вот сходу не понял, как там явно указать кодировку (такое свойство есть, но ReadOnly). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2018, 08:38 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
А, понял, ее при создании экземпляра можно указать: Код: pascal 1. Еще раз спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2018, 09:06 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Вот когда хотя бы Pos сделают для TBytes, можно будет начать говорить о ненужности однобайтовых строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2018, 11:34 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Попробовал вместо велосипеда на скорую руку сделать самокат, чтобы как-то приблизить функционал к AnsiString: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. Если оставить все как есть и в цикле присвоить сотню раз переменной одну и ту же строку: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. то при ReportMemoryLeaksOnShutdown := true; на выходе вижу инфу об утечках памяти: --------------------------- Unexpected Memory Leak --------------------------- An unexpected memory leak has occurred. The unexpected small block leaks are: 21 - 28 bytes: TMBCSEncoding x 100 29 - 36 bytes: TStringStream x 100 The sizes of unexpected leaked medium and large blocks are: 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236 --------------------------- ОК --------------------------- Если раскомментировать в MyString.Implicit строку "R.Free;", то обращение к ds.ss[1] ожидаемо выдает Access violation. Столкнулся с проблемой создания автоматического деструктора для записи. На stackoverflow был совет делать так: Код: pascal 1. 2. 3. 4. 5. 6. 7. Но Дельфа шлет меня лесом - TStringStream это не IInterface. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2018, 13:06 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
У записей деструкторов пока не сделали. Так что придется обернуть объект в интерфейс (потомок interfacedobject, чья единственная функция - в деструкторе делать Free объекту, с которым он связан). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2018, 13:51 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Достаточно type TInterfacedStringStream = class(TStringStream, IInterface) + скопировать реализацию TInterfacedObject. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2018, 13:59 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Спасибо! Но, пожалуйста, изложите последние 2 совета чуть развернутей. Попробовал второй: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. А запись можно оставить как есть, просто добавить поле guard: IInterface; и в конструкторе сделать Self.guard := TInterfacedStringStream(Self.ss)? Компилируется, но на этйо строчке AV вылетает. ЧЯДНТ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2018, 16:40 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Эх, просто не сразу догадался поменять тип в записи: Код: pascal 1. После этого вроде бы все заработало. Всем большое спасибо!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2018, 18:50 |
|
||
|
NextGen compiler и AnsiString
|
|||
|---|---|---|---|
|
#18+
Ну... так, конечно, тоже можно, но слишком уж сложно. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. Можно расширить на любой класс содержимого с помощью дженериков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2018, 10:11 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=38949228&tid=2041097]: |
0ms |
get settings: |
4ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
7ms |
get forum data: |
6ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 422ms |

| 0 / 0 |
