|
|
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Builder C++ 6.0 В программе использую Socket. При сбое в сети не получалось восстановить коннект, выдавалась ошибка Win API. Поэтому сделала при ошибке пересоздание Socket-а: TClientSocket *temp = ClientSocket1; ClientSocket1 = new TClientSocket(temp->Owner); ClientSocket1->Active = false; ClientSocket1->ClientType = temp->ClientType; ClientSocket1->Address = temp->Address; ClientSocket1->Port = temp->Port; ClientSocket1->OnConnect = ClientSocket1Connect; ClientSocket1->OnDisconnect = ClientSocket1Disconnect; ClientSocket1->OnRead = ClientSocket1Read; ClientSocket1->OnError = ClientSocket1Error; delete temp; Но при первом же обращении к ClientSocket1 программа вылетала с Access Violation, такое ощущение, что при delete уничтожался и новый сокет. Тогда переделала: TClientSocket *temp; temp = new TClientSocket(ClientSocket1->Owner); temp->Active = false; temp->ClientType = ClientSocket1->ClientType; temp->Address = ClientSocket1->Address; temp->Port = ClientSocket1->Port; temp->OnConnect = ClientSocket1Connect; temp->OnDisconnect = ClientSocket1Disconnect; temp->OnRead = ClientSocket1Read; temp->OnError = ClientSocket1Error; delete ClientSocket1; ClientSocket1 = temp; Теперь все работает. В общем-то и вопроса нет, но осадок остался. На мой взгляд я делаю в обоих случаях абсолютно одно и то же, так почему же в первом случае не работает? Буся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 16:01 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Не одно и тоже. По второму варианту вопросов нет. В первом варианте после выполнения первой строки Busya TClientSocket *temp = ClientSocket1; в переменых ClientSocket1 и temp содержится одинаковый адрес. В последней строке первого варианта Busya delete temp; уничтожается объект по адресу ClientSocket1, который только что проинициализирован, поэтому и Access Violation. ИМХО. По-моему, непрочитан раздел "Указатели" из учебника по "С". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 17:32 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Я вообще то считала, что в следующей строке первого варианта ClientSocket1 = new TClientSocket(temp->Owner); в ClientSocket1 заносится новый адрес, а в temp остается старый ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 17:34 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
BusyaЯ вообще то считала, что в следующей строке первого варианта ClientSocket1 = new TClientSocket(temp->Owner); в ClientSocket1 заносится новый адрес, а в temp остается старый Ты права, а pirovindos - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 17:37 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
может и права, а на деле первый вариант не работает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 17:38 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
посмотри в дебуге, что не так работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 17:49 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Следующая строчка текста: if (ClientSocket1->Active) Вот на ней и вылетает в первом варианте по EAccessViolation А во втором варианте все в порядке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 17:54 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
да ты не на строчку смотри, ты на данные смотри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 18:06 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
А точно ClientSocket1 имеет тип TClientSocket*? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 18:59 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
а дебагить сервис как-то не в кайф. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 22:13 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Busyaа дебагить сервис как-то не в кайфне стал бы я в сервисе использовать T*Socket. Сам использую synapse - доволен безмерно :) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 07:13 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
BusyaЯ вообще то считала, что в следующей строке первого варианта ClientSocket1 = new TClientSocket(temp->Owner); в ClientSocket1 заносится новый адрес, а в temp остается старый Да. Признаю, облажался. В упор не видел строчки с new. Видно к концу рабочего дня читать исходники уже не могу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 14:13 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Можно ли узнать у автора где и как объявлен ClientSocket1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 15:14 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
ClientService1 объявлен в DataModule, созданном при разработке, не в runtime ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 15:52 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Есть предположение: во время исполнения кода первого варианта. например, между n-ей и n+1-ой строкой происходит событие, которое требует обработки, и тогда прерывается исполнение этого кода и начинается исполнения другого куска кода, где есть обращение к переменной ClientSocket1, еще не проинициализированной до конца и ... - результат непредсказуем. Версия слабенкая так как, тогда: 1. Падать должна в другом месте. 2. Падать должно иногда, а не всегда. 2. Может упасть и при 2-ом варианте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 16:08 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
настаиваю на дебуге. Если не можешь дебуг, смотри асмовый код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 16:13 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Итак, поясняю. Я вставила печать в файл между каждыми строчками этого проклятого кода. После процитированного куска идет следующее "if (ClientSocket1->Active)", естественно перед иф-ом была вставлена печать. В этом иф-е (он заметим без элса) первой строчкой опять же вставлена была печать. И после иф-а тоже тут же была вставлена печать. Итак печать перед ифом срабатывала, а в иф-е, и тем более после иф-а нет. Так что вопросов никаких - вылетало именно при чтении проперти ClientSocket1->Active. Еще варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 16:16 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Не красавица, так не пойдет. Надо в дебуггере стучать. Если память сломала, то печатью ошибку только вглубь загонишь. Причем не факт, что память сломалась на пересоздании сокета, может и в километре от этого места ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 16:20 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 16:29 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Вроде клиентсокет, в неблокирущем варианте, поток запускает для обмена данными ... может там чего ... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 16:35 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Очень хорошая идея распечатать адреса, как-то не подумала, итак (первый temp, второй ClientSocket1): после TClientSocket *temp = ClientSocket1; 1: 009E88A8 009E88A8 после ClientSocket1 = new TClientSocket(temp->Owner); 2: 009E88A8 00A08DE4 перед delete temp; 3: 009E88A8 00A08DE4 после delete temp; 4: 009E88A8 00000000 Нонсенс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 18:32 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Слушайте, я провела эксперимент, итак, чистая форма, кнопка и сокет, вот дфм: object Form1: TForm1 Left = 192 Top = 107 Width = 696 Height = 480 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 296 Top = 120 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click end object ClientSocket1: TClientSocket Active = False ClientType = ctNonBlocking Port = 0 Left = 112 Top = 32 end end Вот текст на кнопку: TClientSocket *temp = ClientSocket1; FILE *log=fopen("c:\\log.txt","a"); fprintf(log,"1: %p %p\n",temp,ClientSocket1); ClientSocket1 = new TClientSocket(temp->Owner); fprintf(log,"2: %p %p\n",temp,ClientSocket1); ClientSocket1->Active = false; ClientSocket1->ClientType = temp->ClientType; ClientSocket1->Address = temp->Address; ClientSocket1->Port = temp->Port; fprintf(log,"3: %p %p\n",temp,ClientSocket1); delete temp; fprintf(log,"4: %p %p\n",temp,ClientSocket1); fclose(log); Все больше ничего. И вот содержимое полученного файла: 1: 00BC6E30 00BC6E30 2: 00BC6E30 00BC723C 3: 00BC6E30 00BC723C 4: 00BC6E30 00000000 Версия С: Enterprise 6.0 Build 10.166 Windows 2000 Build 2195 SP4 Может для интереса проверите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 20:46 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Busya B> Версия С: Enterprise 6.0 Build 10.166 B> Windows 2000 Build 2195 SP4на 5-ке тоже самое если в отладчике провалиться внутрь delete temp, то видим вот что: Код: plaintext 1. 2. 3. 4. 5. 6. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 22:06 |
|
||
|
Помогите найти разницу
|
|||
|---|---|---|---|
|
#18+
Похоже, что объект по адресу ClientSocket1 создается а OnCreate функции формы. Ведь в прикладном коде нигде нет выделение памяти по ClientSocket1. И целостность указателей на элементы формы, видимо, отслеживает борландовская библиотека. Которая и обнуляет ClientSocket1. Например, если поставить печать после delete ClientSocket1 в первом варианте тоже 0 в адресе получится или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2007, 12:05 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34494068&tid=2028940]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
56ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 382ms |

| 0 / 0 |
