func SolveTask(client ClientInfo, task_data []byte, task_id int) {
	fmt.Println("SolveTask: Start")
	task := tsp_types.TaskType{}
	task.FromXml(task_data)

	new_task := &TaskQueueItem{}
	new_task.Init(task_id)
	task_queue.PushBack(new_task)

	go TaskHandler(new_task)
	go AnswerCombiner(new_task)

	//split
	enabled, task1, task2 := tsp_solver.CrusherImpl(&task)
	for enabled {
		new_task.SubTasks <- task1
		new_task.SentTasksCount.Inc()
		new_task.PreparedTasks <- true
		task2.MinCost = new_task.CurrMinCost.Get()
		enabled, task1, task2 = tsp_solver.CrusherImpl(task2)
	}
	new_task.PrepareFinished = true
	new_task.PreparedTasks <- false
	final_answer := <-new_task.FinalAnswer

	msg := []byte(final_answer.ToXml())
	err := binary.Write(*client.Conn, binary.LittleEndian, int64(len(msg)))
	if err != nil {
		fmt.Printf("[SolveTask] Write data error: %v", err)
		return
	}
	(*client.Conn).Write(msg)
	task_queue.Remove(new_task.ID)
	fmt.Println("[SolveTask] Finish")
}