Q&A

  • Thread에서 synchronized..
초보적인 질문 입니다..
정말 쑥스럽군요 ㅠㅠ

TSendUDPThread 라는 클래스의 스레드를 수행하는 프로그램인데요..
resume 하게되면
sendSearchNode(m_node, m_action);  procedure를 호출하게 됩니다..
sendSearchNode 프로시저에서 Tree를 검색하면서 데이터 처리를 하게되는데요.
sychronized 가 안맞는지 자주 오류가 뜹니다.. 특히 DB처리시..

그래서 Thread에서 sendSearchNode를 synchronized를 해주고 싶은데..
어떠한 식으로 해줘야 하는지 알려주시면 감사하겠습니다..

Execute procedure안에서
synchronized( sendSearchNode(m_node, m_action) );   이곤 안되더군요 ㅠㅠ..




{ TSendUDPThread }
constructor TSendSearchThread.Create(Node : PVirtualNode; Action : Integer);
begin
inherited Create(True);
self.m_action := Action;
Self.m_node := Node;
FreeOnTerminate := True;
end;

procedure TSendSearchThread.Execute;
begin
F_Debug.Display.Lines.Add('node check : sendSearch Thread Run...');
sendSearchNode(m_node, m_action);
F_SessionManager.sessionListRefresh.Enabled := true;   // sessionList Refresh ON

end;

// Node의 체크여부를 확인하여 sendUDPMessage()를 호출한다.
procedure TSendSearchThread.sendSearchNode(Node : PVirtualNode; m_Action : Integer);
var
Data : PCustRec;
i, Count : Integer;
begin
with F_SessionManager do
if (Node.CheckState = csCheckedNormal) or (Node.CheckState = csMixedNormal) then
begin
   setNodeDefaultData(Node);             // node_response=0, node_check=1, node_expand
   incNodeCount(Node);                   // node increment count
   Data := VST_Session.GetNodeData(Node);
   sendUDPMessage(Data.nodeType-1, m_Action, Node);

   Count := Node.ChildCount;
   if (count > 0) then
   begin
     Node := Node.FirstChild;
     for i:=0 to Count-1 do
     begin
       if (Node.ChildCount > 0) then       // relay
         self.sendSearchNode(Node, m_Action)
       else begin
         if (Node.CheckState = csCheckedNormal) or (Node.CheckState = csMixedNormal) then
         begin
           setNodeDefaultData(Node);         // node_response=0, node_check=1, node_expand
           incNodeCount(Node);               // node increment count
           Data := VST_Session.GetNodeData(Node);
           sendUDPMessage(Data.nodeType-1, m_Action, Node);
         end;
       end;
       if (i < Count-1) then
         Node := Node.NextSibling;
     end;  // for
   end;  // if
end;

end;
0  COMMENTS