TIdTCPServer's TIdContext-> Data нечетное поведение - PullRequest
0 голосов
/ 11 апреля 2019

Чтобы отправить данные нескольким клиентам, я создаю TIdThreadSafeStringList в OnConnect и назначаю его AContext->Data примерно так

AContext->Data = new TIdThreadSafeStringList

Когда клиент отключается, его список строк удаляется в OnDisconnectвот так

delete AContext->Data

Однако это приводит к AV.Если я обнуляю параметр, например,

delete AContext->Data
AContext->Data = NULL

, AV исчезает.Есть ли какая-то автоматическая очистка, о которой я не знаю?

Использование C ++ Builder 10.2.3.

1 Ответ

1 голос
/ 12 апреля 2019

Есть ли какая-то автоматическая очистка, о которой я не знаю?

Да.TIdContext происходит от TIdTask, которому принадлежит свойство Data.Деструктор TIdTask вызывается после события OnDisconnect и освобождает объект Data, если это не NULL.

Другой (предпочтительный) способ справиться с этой ситуацией - вместо этого получить новыйкласс из TIdServerContext и добавьте свой TIdThreadSafeStringList к этому классу (и любой другой пользовательской функциональности, которую вы хотите), например:

class TMyContext : public TIdServerContext
{
public:
    TIdThreadSafeStringList *MyList;

    __fastcall TMyContext(TIdTCPConnection *AConnection, TIdYarn *AYarn, TIdContextThreadList *AList = NULL)
        : TIdServerContext(AConnection, AYarn, AList)
    {
        MyList = new TIdThreadSafeStringList;
    }

    __fastcall ~TMyContext()
    {
        delete MyList;
    }

    //...
};

Затем присвойте свой тип класса свойству ContextClass сервераво время выполнения перед активацией сервера, например:

__fastcall TMyForm::TMyForm(TComponent *Owner)
    : TForm(Owner)
{
    IdTCPServer1->ContextClass = __classid(TMyContext);
    //...
}

Затем вы можете просто привести любой указатель TIdContext*, принадлежащий серверу, к типу вашего класса, чтобы получить доступ к TIdThreadSafeStringList (или другомуфункциональность):

static_cast<TMyContext*>(SomeIdContext)->MyList->...

Таким образом, вы можете полностью игнорировать свойство TIdContext::Data или использовать его для других целей, если это необходимо.

...